当前位置: 首页 > news >正文

Spring Data JPA使用及实现原理总结

 Spring Data JPA系列

1、SpringBoot集成JPA及基本使用

2、Spring Data JPA Criteria查询、部分字段查询

3、Spring Data JPA数据批量插入、批量更新真的用对了吗

4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作

5、Spring Data JPA自定义Id生成策略、复合主键配置、Auditing使用

6、【源码】Spring Data JPA原理解析之Repository的自动注入(一)

7、【源码】Spring Data JPA原理解析之Repository的自动注入(二)

8、【源码】Spring Data JPA原理解析之Repository执行过程及SimpleJpaRepository源码

9、【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(一)

10、【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(二)

11、【源码】Spring Data JPA原理解析之Repository自定义方法添加@Query注解的执行原理

12、【源码】SpringBoot事务注册原理

13、【源码】Spring Data JPA原理解析之事务注册原理

14、【源码】Spring Data JPA原理解析之事务执行原理

15、【源码】SpringBoot编程式事务使用及执行原理

16、【源码】Spring事务之传播特性的详解

17、【源码】Spring事务之事务失效及原理

18、【源码】Spring Data JPA原理解析之Hibernate EventListener使用及原理

19、【源码】Spring Data JPA原理解析之Auditing执行原理

20、Spring Data JPA使用及实现原理总结

前言

《 Spring Data JPA系列》博文已经写了19篇,对于Spring Data JPA,还有其他的知识点,该系列博文暂时先写这些。该系列从入门到高级、再到源码解读,分享了Spring Data JPA在开发中最常用的技术点和实现原理。本篇对《Spring Data JPA系列》做一个总结。

Spring Data JPA简介

Spring Data JPA是Spring提供的一套简化JPA开发的框架,按照约定好的方法名命规则写DAO层接口,可以在不写接口实现的情况下,实现对数据库中Table的操作,同时提供了除CRUD操作之外的许多功能,如分页、复杂查询等。

Repository接口类型

在JPA中,通过自定义Repository接口,实现对数据库的操作。Repository接口的接口方法类型为以下三类:

1)第一类Repository接口为继承JpaRepositoryImplementation接口的接口方法,该接口提供并自动实现了对实体类的CRUD等的操作;

2)通过方法命名规则,自定义接口方法,无需写SQL或HQL,实现数据库表的操作,主要针对数据库表的查询、删除操作;

方法名称规则:

操作(关键字)+ By + 属性名称(属性名称的首字母大写)+ 查询条件(首字母大写)

操作关键字包括:

find | read | get | query | search | stream | count | exists | delete | remove

查询条件包括:

And | Or | Is | Equals | Between | LessThan | Before | LessThanEqual | GreaterThan | After | GreaterThanEqual | IsNull | IsNotNull | NotNull | Like | NotLike | StartingWith | EndingWith | Containing | OrderBy | Not | In | NotIn | True | False | IgnoreCase | OrderBy

3)通过@Query注解,添加SQL或HQL,自定义接口方法,实现数据库表的操作;

在@Query注解中,支持三类查询语句的书写形式,分别如下:

a)通过@Query注解的value属性,填写HQL语句;

b)通过@Query注解的value属性,填写SQL语句,nativeQuery属性设置为true;

c)通过@Query注解的name属性,填写对应的queryName。其中:queryName为在实体类中,通过@NamedQueries、@NamedQuery注解添加的HQL语句;

详见:SpringBoot集成JPA及基本使用-CSDN博客

EntityManager实现的数据库操作

在JPA中,除了通过Repository接口实现对数据库的操作以外,还可以通过EntityManager编码,实现数据库操作。

Java Persistence API(JPA)中的EntityManager是一个接口,在JPA规范中,EntityManager扮演着执行持久化操作的关键角色。普通Java对象只有被EntityManager持久化之后,才能转变为持久化对象,保存到数据库中。它不仅可以管理和更新Entity对象,还可以基于主键查询Entity对象,通过JPQL语句进行Entity查询,甚至通过原生SQL语句进行数据库更新及查询操作。

EntityManager提供以下功能:

1)创建、更新和删除数据:EntityManager中的persist()、merge()和remove()方法分别用于插入、更新和删除数据库记录;

2)查询数据:EntityManager的find()和createQuery()方法用于查询数据;

3)管理实体的生命周期:EntityManager的flush()方法用于将持久性上下文同步到基础数据库,进行持久化操作;

4)事务管理:EntityManager的getTransaction()方法用于获取当前事务,可以对事务进行提交或回滚;

5)执行原生SQL:EntityManager的createNativeQuery()方法用于执行原生SQL。对于原生SQL,需要考虑不同数据库的各自实现;

6)创建CriteriaBuilder:EntityManager的getCriteriaBuilder()方法用于获取CriteriaBuilder。通过CriteriaBuilder实现使用Criteria API查询数据;

详见:Spring Data JPA数据批量插入、批量更新真的用对了吗-CSDN博客

Criteria查询

JPA的Repository接口操作数据库时,无法很好的支持动态条件查询,Criteria查询可以很好的解决这个问题。

Criteria查询的API主要包括:

1)CriteriaBuilder:用于构造条件查询、复合选择、表达式、谓词和排序;

2)CriteriaQuery:定义了特定于顶级查询的功能,包含了查询的各个部分。如:select结果集、where条件、group by、order by等。在CriteriaQuery指定返回值结果集;

3)Root:定义Criteria查询的根对象,Criteria查询的根定义为实体类型,它与SQL查询中的FROM子句类似,定义了查询的FROM子句中能够出现的类型。可以有多个查询根对象;

4)Expression:运算表达式。用在查询语句的select、where和having子句中,该接口有isNull、isNotNull和in方法。可通过Root.get(“实体类属性”)获得Expression对象;

5)Predicate:过滤条件。通过CriteriaQuery.where()方法,将Predicate或Expression实例作为条件应用到Criteria查询中;

Predicate实例可以通过CriteriaBuilder的条件方法(equal、notEqual、gt、ge、lt、le、between、like等)创建;

Predicate实例也可以通过Expression实例的isNull、isNotNull和in方法获得;

复合的Predicate语句,可以使用CriteriaBuilder的and、or、andnot方法构建;

详见:Spring Data JPA Criteria查询、部分字段查询-CSDN博客

JPA多表关系

在JPA中,支持多表关系定义及多表级联操作。

多表关系主要相关注解:

@OneToOne注解:表示一对一关系;

@OneToMany、@ManyToOne注解:表示一对多关系;

@ManyToMany注解:表示多对多关系;

@JoinColumn注解:标记实体类与数据库的对应关系,以@OneToOne、@OneToMany、@ManyToOne三个注解搭配使用;

@JoinTable注解:多对多通常使用中间表关联,通过该注解标记关联表,以@ManyToMany注解搭配使用。属性name为关联表的名称、joinColumns为关联student表的id、inverseJoinColumns为关联Course表的id;

多表级联操作是指当一个实体的状态发生改变时,关联的其他实体是否同时发生改变。简单理解:cascade用于设置当前实体是否能够操作关联的另一个实体的权限。cascade的取值在CascadeType枚举类中定义。

详见:Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作

实体类Id生成策略

JPA默认支持四种Id生成策略,分别为TABLE(使用数据库表格保存主键)、SEQUENCE(使用底层数据库的序列来生成主键)、IDENTITY(主键由数据库自动生成)、AUTO(主键由程序控制)。通过@GeneratedValue注解中的strategy属性指定对应生成策略。

除了以上四种默认支持的策略以外,JPA还支持自定义Id生成策略,通过实现org.hibernate.id.IdentifierGenerator接口,重写generate()方法,在方法中返回Id值。

通过@GenericGenerator注解,指定自定义Id策略的名称name及对应的策略strategy的类,并添加@GeneratedValue注解的generator属性为@GenericGenerator注解的name属性。

复合主键

在Spring Data JPA的实体类中并不支持简单的直接在多个属性中添加@Id注解实现复合主键。而是需要先创建一个复合主键类,然后在实体类中使用@IdClass注解将主键类附加在类中,然后在多个主键属性中添加@Id主键。

Auditing审计

JPA通过@CreateBy、@CreateDate、@LastModifiedBy、@LastModifiedDate四个注解,提供对数据库表中的数据记录自动添加操作人及操作时间的审计功能。

在实际开发中,可以定义一个抽象父类,专门记录操作人及操作信息。在该父类中添加@MappedSuperclass注解。

Auditing使用

1)在启动类中添加@EnableJpaAuditing注解,开启Auditing;

2)在实体类中添加监听器及操作人、操作时间的注解。或者定义一个抽象父类,专门记录操作人及操作信息。并添加@EntityListeners注解,添加AuditingEntityListener监听器;

3)自定义AuditorAware,重写getCurrentAuditor(),返回审计员主键,实现数据记录的创建人、操作人的自动填充;

详见:Spring Data JPA自定义Id生成策略、复合主键配置、Auditing使用-CSDN博客

Repository自动注入原理

JPA的Repository注入到Spring IOC容器的对象为代理对象,其中target为SimpleJpaRepository对象,实现了自定义的Repository接口、Repository接口以及TransactionProxy接口,主要添加了QueryExecutorMethodInterceptor、TransactionInterceptor等拦截器。

注入的主要执行流程如下:

1)在SpringBoot中引入spring-boot-starter-data-jpa依赖时,会自动注入JpaRepositoriesAutoConfiguration,从而注入JpaRepositoryConfigExtension;

2)在JpaRepositoryConfigExtension的父类RepositoryConfigurationExtensionSupport的getRepositoryConfigurations()方法中,获取所有实现Repository接口的类,封装成RepositoryConfiguration;

3)SpringBoot启动时,会执行RepositoryConfigurationDelegate的registerRepositoriesIn()方法,在该方法中,获取2)中所有实现Repository接口的类,创建对应的BeanDefinition对象,其中beanClass为"org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean"字符串。并执行registry.registerBeanDefinition(beanName, beanDefinition),将Repository类及对应的beanDefinition添加到Spring IOC容器中;

4)在Spring启动过程中,会执行AbstractBeanFactory.doGetBean()方法,先从Repository的BeanDefinition中,获取beanClass,为JpaRepositoryFactoryBean类名,然后创建JpaRepositoryFactoryBean对象。执行afterPropertiesSet()方法,完成初始化;

5)在JpaRepositoryFactoryBean的afterPropertiesSet()初始化方法中,会调用RepositoryFactorySupport.getRepository()方法。该方法通过代理的的方式,创建一个实现了自定义的Repository接口、Repository以及TransactionProxy接口,且代理的target为SimpleJpaRepository对象,代理添加了QueryExecutorMethodInterceptor、TransactionInterceptor等拦截器。代理的对象保存在repository属性中;

6)执行了JpaRepositoryFactoryBean对象的afterPropertiesSet()初始化之后,会调用AbstractBeanFactory.getObjectForBeanInstance(),从JpaRepositoryFactoryBean工厂bean中执行getObject(),返回创建的代理repository对象;

详见:

【源码】Spring Data JPA原理解析之Repository的自动注入(一)-CSDN博客

【源码】Spring Data JPA原理解析之Repository的自动注入(二)-CSDN博客

提醒:最好指定Repository所在的包,以免扫描整个SpringBoot启动类所在的包及其子包来获取Repository类

Repository接口实现原理

Repository在Spring容器中为代理对象,Repository接口的接口方法有三种类型,其实现原理分别为:

11.1)继承JpaRepositoryImplementation接口的接口方法

在Repository代理对象中,target为SimpleJpaRepository对象。该对象实现了JpaRepositoryImplementation接口。

当执行JpaRepositoryImplementation接口中的方法时,在动态代理中,会调用执行SimpleJpaRepository的对应方法。

在SimpleJpaRepository中,通过EntityManager接口及Criteria查询接口实现了对数据库的相关操作。

详见:

【源码】Spring Data JPA原理解析之Repository执行过程及SimpleJpaRepository源码

11.2)通过方法命名规则

通过方法命名规则,自定义接口方法的实现是通过Repository代理对象中的QueryExecutorMethodInterceptor拦截器中实现的。

主要执行流程如下:

1)QueryExecutorMethodInterceptor方法拦截器的构造方法中,会根据查询查找策略CreateIfNotFoundQueryLookupStrategy,获得RepositoryQuery对象,解析方法。对于按方法命名规则实现的方法,使用的RepositoryQuery对象为PartTreeJpaQuery;

2)在PartTreeJpaQuery构造方法中,创建一个PartTree对象,解析方法名称中的起始关键字【如:findBy、readBy、deleteBy等】、条件属性【实体类中的属性】、查询关键字【Between、In、Equals等】;

3)创建对应方法的countQuery和query,将解析出的查询的基础信息封装在QueryPreparer对象中,根据解析出的查询信息,创建CriteriaQuery对象;

4)解析完方法信息,保存在PartTreeJpaQuery后,保存到QueryExecutorMethodInterceptor的Map<Method, RepositoryQuery> queries中;

5)当Repository的接口被调用的时候,在ReflectiveMethodInvocation.proceed()中,先执行QueryExecutorMethodInterceptor.invoke()方法;

5.1)调用doInvoke()方法,获取数据库执行后的数据;

5.1.1)调用RepositoryQueryMethodInvoker.invoke() -> RepositoryQuery.execute() -> AbstractJpaQuery.execute() -> AbstractJpaQuery.doExecute() -> JpaQueryExecution.execute() -> JpaQueryExecution.doExecute();

5.1.2)doExecute()是一个抽象方法,针对不同的数据库查询返回值信息,使用不同的实现类。所有的实现类都会先调用AbstractJpaQuery.createQuery(),获取一个Query对象;

5.1.3)在AbstractJpaQuery.createQuery()中,调用抽象方法doCreateQuery()。对于按方法命名规则的Repository接口,实现类为PartTreeJpaQuery;

5.1.4)在PartTreeJpaQuery.coCreateQuery()方法中,通过EntityManager.createQuery(criteriaQuery)返回TypedQuery,然后执行invokeBinding(),在TypedQuery对象中,调用query.setParameter()绑定查询条件的参数值,如果有分页,设置分页信息;

5.1.5)参数完参数,在6.1.3中设置hint等。然后执行6.1.2中的具体实现类,执行数据库查询。如SingleEntityExecution实现类,执行TypeQuery.getSingleResult(),然后单个结果;

5.2)调用resultHandler.postProcessInvocationResult(),对数据库查询后的值进行返回值类型转换;

详见:

【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(一)

【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(二)

11.3)通过@Query注解

通过@Query注解,添加SQL或HQL,自定义接口方法的实现也是通过Repository代理对象中的QueryExecutorMethodInterceptor拦截器中实现的。对比方法命名规则的实现,差异在于使用不同的查询解析方法。

主要执行流程如下:

1)QueryExecutorMethodInterceptor方法拦截器的构造方法中,会根据查询查找策略CreateIfNotFoundQueryLookupStrategy,获得RepositoryQuery对象,解析方法。对于添加@Query注解的方法,使用的RepositoryQuery对象为SimpleJpaQuery和NativeJpaQuery;

2)SimpleJpaQuery和NativeJpaQuery都是继承AbstractStringBasedJpaQuery,在AbstractStringBasedJpaQuery构造方法中,解析对应的queryString和countQueryString,生成DeclaredQuery对象,实际对象为ExpressionBasedStringQuery。核心的解析过程在父类StringQuery中;

3)解析完方法信息,保存在父类AbstractStringBasedJpaQuery后,保存到QueryExecutorMethodInterceptor的Map<Method, RepositoryQuery> queries中;

4)当Repository的接口被调用的时候,在ReflectiveMethodInvocation.proceed()中,先执行QueryExecutorMethodInterceptor.invoke()方法;

4.1)调用doInvoke()方法,获取数据库执行后的数据;

4.1.1)调用RepositoryQueryMethodInvoker.invoke() -> RepositoryQuery.execute() -> AbstractJpaQuery.execute() -> AbstractJpaQuery.doExecute() -> JpaQueryExecution.execute() -> JpaQueryExecution.doExecute();

4.1.2)doExecute()是一个抽象方法,针对不同的数据库查询返回值信息,使用不同的实现类。所有的实现类都会先调用AbstractJpaQuery.createQuery(),获取一个Query对象;

4.1.3)在AbstractJpaQuery.createQuery()中,调用抽象方法doCreateQuery()。对于添加@Query注解Repository接口,实现类为SimpleJpaQuery或NativeJpaQuery,方法实现在父类AbstractStringBasedJpaQuery.doCreateQuery();

4.1.4)在AbstractStringBasedJpaQuery.doCreateQuery()方法中,通过EntityManager.createQuery(queryString)返回Query【如果是NativeJpaQuery,使用EntityManager.createNativeQuery(queryString)返回Query】,然后执行invokeBinding(),在Query对象中,调用query.setParameter()绑定查询条件的参数值,如果有分页,设置分页信息;

4.1.5)参数完参数,在6.1.3中设置hint等。然后执行6.1.2中的具体实现类,执行数据库查询。如SingleEntityExecution实现类,执行TypeQuery.getSingleResult(),然后单个结果;

4.2)调用resultHandler.postProcessInvocationResult(),对数据库查询后的值进行返回值类型转换;

Auditing审计实现原理

JPA接口中提供了持久化的监听回调注解,通过添加注解,可以监听实体的新增、修改、删除的前后状态。

主要执行流程如下:

1)JPA的提供了持久化的监听回调注解;

2)Spring解析实体类时,会解析实体类中添加的监听回调注解的监听器;或者实体类中的@EntityListeners注解中的监听器,并归类存放在FastSessionServices中,然后将FastSessionServices传给SessionImpl对象。对于Auditing,监听器为AuditingEntityListener,添加了@PrePersist和@PreUpdate,在新增和修改之前回调。

3)Auditing审计功能通过添加@EnableJpaAuditing注解,自动为AuditingEntityListener添加AuditHandler对象;

4)AuditHandler对象提供了对当前执行持久化对象的审计相关注解的属性获取、审计人获取;

5)JPA通过SessionImpl执行新增或修改操作时,会调用FastSessionServices中对应操作类型的监听器,从而执行AuditingEntityListener的方法;

6)AuditingEntityListener通过AuditHandler及当前的实体类,通过反射,为实体类的审计属性赋值;

详见:

【源码】Spring Data JPA原理解析之Hibernate EventListener使用及原理-CSDN博客

【源码】Spring Data JPA原理解析之Auditing执行原理-CSDN博客

JPA事务

12.1)事务说明

事务是指在数据库管理系统中,一系列紧密相关的操作序列,这些操作作为一个单一的工作单元执行。事务的特点是要么全部成功,要么全部失败,不会出现部分完成的情况。如果事务中的任何一个操作失败,那么整个事务都会被回滚到开始之前的状态,以确保数据库的一致性和完整性。

事务的四个特性为:原子性、一致性、隔离性和持久性。通常称为ACID。

在Spring框架中,数据操作的事务是通过添加@Transactional注解来实现的。

12.2)JPA事务实现原理

JPA的Repository注入到Spring IOC容器的对象为代理对象,其中添加了TransactionInterceptor拦截器,在该拦截器中实现了事务。

主要执行流程如下:

1)当方法调用时,执行TransactionInterceptor.invoke()方法,该方法调用父类TransactionAspectSupport.invokeWithinTransaction()方法;

2)解析原方法的@Transactional注解信息,封装为TransactionAttribute对象;

3)从Spring容器中获取JpaTransactionManager对象;

4)根据传播特性,选择性开启事务;

5)在try中执行ReflectiveMethodInvocation.proceed()方法,直至执行原方法,获取返回值;

6)在catch中捕获异常,如果出现异常,执行completeTransactionAfterThrowing(),对满足回滚规则的,执行回滚;如果不满足回滚规则,依然提交事务,并抛出异常,结束方法;

7)如果没有异常,提交事务;

详见:

【源码】Spring Data JPA原理解析之事务注册原理-CSDN博客

【源码】Spring Data JPA原理解析之事务执行原理-CSDN博客

【源码】Spring事务之传播特性的详解-CSDN博客

12.3)事务失效

事务使用不当时,可能导致事务失效。常见的事务失效场景如下:

1)访问权限问题。非public访问权限的方法,即使添加了@Transactional注解,事务无效;

2)无效异常。Spring事务回滚是通过异常捕获实现的,默认只处理RuntineException或Error异常,也可以通过@Transactional的rollbackFor参数设置回滚异常;

3)业务异常捕获。如果在业务中捕获了异常,Spring事务无法捕获到异常,回滚失效。需要通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),设置回滚状态;

4)内部方法调用。在一个上下文没有事务的方法中,通过this调用内部添加@Transactional注解的方法时,事务无效。因为此时的this是目标对象,不是对应的代理对象;

5)传播特性使用不当。

6)异步线程调用。事务信息是通过ThreadLocal保存在本地线程变量中,对于异步线程无效;

详见:

【源码】Spring事务之事务失效及原理-CSDN博客

【源码】Spring事务之传播特性的详解-CSDN博客

JPA的优点与缺点

13.1)优点

1)简化数据持久化操作:JPA框架提供了一系列的API和工具,提供实体的CRUD方法,减少SQL语句的编写,开发效率高;

2)可移植性好:JPA框架是基于对象关系映射(ORM)的规范,底层采用Hibernate,提供标注的查询语言,对象化程度更好,使得开发人员可以更加方便地切换不同的数据库;

13.2)缺点

1)性能问题:通过源码篇能够了解到,JPA框架提供了较为复杂的对象关系映射机制,可能会影响系统的性能;

2)灵活性较差:JPA强调对象模型和数据库模型的映射,对于复杂的SQL操作,可能需要使用Criteria API或转为Native SQL;

结尾

以上为本篇分享的全部内容。

关于本篇内容你有什么自己的想法或独到见解,欢迎在评论区一起交流探讨下吧。

相关文章:

Spring Data JPA使用及实现原理总结

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…...

【C语言】extern 关键字

在C语言中&#xff0c;extern关键字用于声明一个变量或函数是定义在另一个文件中的。它使得在多个文件之间共享变量或函数成为可能。extern关键字常见于大型项目中&#xff0c;通常用于声明全局变量或函数&#xff0c;这些变量或函数的定义位于其他文件中。 基本用法 变量声明…...

Linux--V4L2应用程序开发(二)改变亮度

一、思路流程 创建一个新线程用来控制亮度&#xff0c;线程通过读取用户输入来增加或减少亮度值&#xff0c;并使用 ioctl 函数将新亮度值设置到视频设备。 二、代码 /*创建线程来控制亮度*/ pthread_t thread; pthread_create(&thread, NULL, thread_brightness_contrl…...

[Gstreamer] 消息处理handler的设置

前言&#xff1a; Gstreamer 提供以 GstMessage 和 GstBus 为基础的消息传递机制&#xff0c;所有GstMessage 发送的时候都需要指定 GstBus 用来明确当前 message 将在哪条 Bus 上流转。所有的 GstMessage 最终都会进入一个handler&#xff0c;这个handler函数可以通过两种方式…...

线性代数笔记

行列式 求高阶行列式 可以划上三角 上三角 余子式 范德蒙行列式 拉普拉斯公式 行列式行列对换值不变 矩阵 矩阵的运算 同型矩阵加减 对应位置相加减 矩阵的乘法 左边第 i 行 一次 相乘求和 右边 第 j 列 eg 中间相等 两边规模 矩阵的幂运算 解题思路 找规律 数学归纳…...

未公开 GeoServer开源服务器wfs远程命令执行漏洞 已复现(CVE-2024-36401)

0x01 阅读须知 技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成…...

【WebGIS干货分享】Webgis 面试题-浙江中海达

1、Cesium 中有几种拾取坐标的方式&#xff0c;分别介绍 Cesium 是一个用于创建 3D 地球和地理空间应用的 JavaScript 库。在 Cesium 中&#xff0c;你可以使用不同的方式来拾取坐标&#xff0c;以便与地球或地图上的对象进行交 互。以下是 Cesium 中几种常见的拾取坐标的方式…...

ES 修改索引字段类型

大体的原理&#xff1a; 1&#xff1a;按照老索引按需修改&#xff0c;新建新索引 2&#xff1a;转移数据&#xff08;数据量大&#xff0c;时间会很长&#xff09; 3&#xff1a;删除老索引 4&#xff1a;给新索引 创建别名 第一步&#xff1a;创建新索引 可以先获取老索引ma…...

恢复的实现技术-日志和数据转储

一、引言 在系统正常运行的情况下&#xff0c;事务处理的恢复机制应采取某些技术措施为恢复做好相应的准备&#xff0c;保证在系统发生故障后&#xff0c;能将数据库从一个不一致的错误状态恢复到一个一致性状态 恢复技术主要包括 生成一个数据库日志&#xff0c;来记录系统中…...

全网最全最细的jmeter接口测试教程,建议收藏

在日常工作中&#xff0c;尤其是做接口测试时&#xff0c;我们最经常用到的两个工具&#xff0c;就是Jmeter和postman。今天&#xff0c;我们主要是讲一讲Jmeter在接口测试这一块的一些方式方法。内容比较多&#xff0c;大家可以收藏一下&#xff0c;以后慢慢学。 1&#xff0…...

Raspbian命令行连接WiFi网络

Raspbian命令行连接WiFi网络 1. 源由2. 环境3. 信号4. 连接5. 检查6. 断开 1. 源由 “懒人”多福&#xff0c;是什么原因&#xff0c;大家知道不&#xff0c;哈哈。 如果大家关注过之前《Ardupilot开源代码之Rover上路计划》&#xff0c;为了笔记本电脑在不断网的情况下进行配…...

王佩丰 Excel 基础二十四讲——目录

前言 跟着B站学习王佩丰 Excel 基础教程&#xff0c;本文章为索引目录 课程传送门&#xff1a;视频地址——点击前往 王佩丰Excel基础教程24讲完整版 第一讲&#xff1a;认识 Excel 第二讲&#xff1a;Excel 单元格格式设置 第三讲&#xff1a;查找替换定位&#xff08;未编辑…...

Qt扫盲-QRect矩形描述类

QRect矩形描述总结 一、概述二、常用函数1. 移动类2. 属性函数3. 判断4. 比较计算 三、渲染三、坐标 一、概述 QRect类使用整数精度在平面中定义一个矩形。在绘图的时候经常使用&#xff0c;作为一个二维的参数描述类。 一个矩形主要有两个重要属性&#xff0c;一个是坐标&am…...

Android系统adb shell怎么执行checksum 来判断文件是否变更?

在Android系统中&#xff0c;通过ADB&#xff08;Android Debug Bridge&#xff09;shell执行checksum&#xff08;校验和&#xff09;来检查文件是否变更是一个常见的需求&#xff0c;尤其是在自动化测试或确保应用文件未被篡改的场景中。在Linux和Android shell中&#xff0c…...

JS中的上下文

一.执行上下文的概念&#xff1a; 执行上下文简称上下文。变量或者函数的上下文决定了它们可以访问哪些数据&#xff0c;以及它们的行为。每一个上下文都具有一个关联的变量对象&#xff0c;而这个上下文中定义的所有变量和函数都存在于这个对象上。 二.JS中上下文的执行机制&a…...

【深度学习】注意力机制

https://blog.csdn.net/weixin_43334693/article/details/130189238 https://blog.csdn.net/weixin_47936614/article/details/130466448 https://blog.csdn.net/qq_51320133/article/details/138305880 注意力机制&#xff1a;在处理信息的时候&#xff0c;会将注意力放在需要…...

安卓开发自定义时间日期显示组件

安卓开发自定义时间日期显示组件 问题背景 实现时间和日期显示&#xff0c;左对齐和对齐两种效果&#xff0c;如下图所示&#xff1a; 问题分析 自定义view实现一般思路&#xff1a; &#xff08;1&#xff09;自定义一个View &#xff08;2&#xff09;编写values/attrs.…...

IT行业入门,如何假期逆袭,实现抢跑

目录 前言 1.IT行业领域分类 2.基础课程预习指南 3.技术学习路线 4.学习资源推荐 结束语 前言 IT&#xff08;信息技术&#xff09;行业是一个非常广泛和多样化的领域&#xff0c;它包括了许多不同的专业领域和职业路径。如果要进军IT行业&#xff0c;我们应该要明确自己…...

Pyramid 中混合认证策略

1. 问题背景 在一个使用 Pyramid 框架开发的应用程序中&#xff0c;需要同时处理 HTML 内容的显示和 JSON API 的请求。对于 HTML 内容&#xff0c;使用了 AuthTktAuthenticationPolicy 进行身份验证和 ACLAuthorizationPolicy 进行授权。当用户成功登录后&#xff0c;会在浏览…...

深度学习经典检测方法概述

一、深度学习经典检测方法 two-stage&#xff08;两阶段&#xff09;&#xff1a;Faster-rcnn Mask-Rcnn系列 one-stage&#xff08;单阶段&#xff09;&#xff1a;YOLO系列 1. one-stage 最核心的优势&#xff1a;速度非常快&#xff0c;适合做实时检测任务&#xff01; 但是…...

<sa8650>sa8650 qcxserver-之-摄像头传感器VB56G4A驱动开发<1>

<sa8650>sa8650 qcxserver-之-摄像头传感器VB56G4A驱动开发 <1> 一、前言二、QCX架构三、QCX 传感器驱动程序定制开发3.1 sensor硬件接口3.2 sensor配置文件3.2.1 cameraconfig.c3.2.2 cameraconfigsa8650_water.c3.2.3 新增编译MK3.2.4 参数解析3.2.4.1 struct Camera…...

推荐8款超实用的ComfyUI绘画插件,帮助我们的AI绘画质量和效率提升几个档次!

前言 大家在使用SD绘画过程中&#xff0c;想必见识到了插件的强大功能&#xff0c;本身纯净版的SD界面是相对简洁的&#xff0c;但是搭配了各种插件后&#xff0c;界面标签栏会增加很多&#xff0c;相应的功能也增加了。 从简单的中文界面翻译插件&#xff0c;到强大的contro…...

MATLAB-振动问题:两自由度耦合系统自由振动

一、基本理论 二、MATLAB实现 以下是两自由度耦合系统自由振动质量块振动过程动画显示的MATLAB程序。 clear; clc; close allx0 1; D1 40; D12 8; D2 D1; m1 1; omega0 sqrt(D1/m1); k1 D12 / D1; k2 D12 / D2; k sqrt(k1 * k2); omegazh omega0 * sqrt(1 k); omeg…...

人工智能-NLP简单知识汇总01

人工智能-NLP简单知识汇总01 1.1自然语言处理的基本概念 自然语言处理难点&#xff1a; 语音歧义句子切分歧义词义歧义结构歧义代指歧义省略歧义语用歧义 总而言之&#xff1a;&#xff01;&#xff01;语言无处不歧义 1.2自然语言处理的基本范式 1.2.1基于规则的方法 通…...

Spring Boot中的异步编程技巧

Spring Boot中的异步编程技巧 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨在Spring Boot应用程序中如何使用异步编程技巧&#xff0c;以提升性…...

深度解密Spark性能优化之道

课程介绍 课程通过实战案例解析和性能调优技巧的讲解&#xff0c;帮助学员提升大数据处理系统的性能和效率。课程内容涵盖了Spark性能调优的各个方面&#xff0c;包括内存管理、并行度设置、数据倾斜处理、Shuffle调优、资源配置等关键技术和策略。学员将通过实际案例的演示和…...

在U盘/移动硬盘上安装热插拔式Ubuntu系统,并将Docker目录挂载到NTFS硬盘

Windows10的WSL2的确给开发人员带来了很多方便&#xff0c;但是仍然有很多缺点。比如&#xff1a;太占系统内存&#xff1b;有些软件无法在WSL2中编译成功&#xff1b;相当于虚拟机&#xff0c;性能不如原装系统。 装双系统&#xff0c;相信大家都不陌生&#xff0c;但它会占用…...

商城小程序论文(设计)开题报告

一、课题的背景和意义 近些年来&#xff0c;随着移动互联网巅峰时期的来临&#xff0c;互联网产业逐渐趋于“小、轻、微”的方向发展&#xff0c;符合轻应用时代特点的各类技术受到了不同领域的广泛关注。在诸多产品中&#xff0c;被誉为“运行着程序的网站”之名的微信小程序…...

15. Java的 CAS 操作原理

1. 前言 本节内容主要是对 CAS 操作原理进行讲解&#xff0c;由于 CAS 涉及到了并发编程包的使用&#xff0c;本节课程只对 CAS 的原理问题进行讲解&#xff0c;有助于同学后续对并发编程工具使用的学习。本节具体内容点如下&#xff1a; 了解 CAS 的概念&#xff0c;这是本节…...

修改element-ui日期下拉框datetimePicker的背景色样式

如图&#xff1a; 1、修改背景色 .el-date-picker.has-sidebar.has-time { background: #04308D; color: #fff; border: 1px solid #326AFF } .el-date-picker__header-label { color: #ffffff; } .el-date-table th { color: #fff; } .el-icon-d-arrow-left:before { color: …...

Linux—— 逻辑运算符,压缩和解压缩

- -a&#xff1a; and 逻辑与 - -o&#xff1a; or 逻辑或 - -not&#xff1a; not 逻辑非 - 优先级&#xff1a;与>或>非 shell [rootserver ~]# find / -size 10k -a -size -50k [rootserver ~]# find /etc -name "e*" -o -name "f*"…...

音视频入门基础:H.264专题(6)——FFmpeg源码:从H.264码流中提取NALU Header、EBSP、RBSP和SODB

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...

STM32实现按键单击、双击、长按、连按功能,使用状态机,无延时,不阻塞

常见的按键判定程序&#xff0c;如正点原子按键例程&#xff0c;只能判定单击事件&#xff0c;对于双击、长按等的判定逻辑较复杂&#xff0c;且使用main函数循环扫描的方式&#xff0c;容易被阻塞&#xff0c;或按键扫描函数会阻塞其他程序的执行。使用定时器设计状态机可以规…...

C#之Delta并联机械手的视觉同步分拣

本文导读 前面两节课程我们介绍了怎么建立Delta并联机械手的正逆解以及如何通过视觉进行匹配定位。本节课程给大家分享如何通过C#语言开发正运动Delta并联机械手传送带同步的视觉分拣。 VPLC711硬件介绍 VPLC711是正运动推出的一款基于x86平台和Windows操作系统的高性能机器…...

01:Linux的基本命令

Linux的基本命令 1、常识1.1、Linux的隐藏文件1.2、绝对路径与相对路径 2、基本命令2.1、ls2.2、cd2.3、pwd / mkdir / mv / touch / cp / rm / cat / rmdir2.4、ln2.5、man2.6、apt-get 本教程是使用的是Ubuntu14.04版本。 1、常识 1.1、Linux的隐藏文件 在Linux中&#xf…...

GNSS 载波、测距码和导航电文的关系简介

1、GNSS 载波、测距码和导航电文 在卫星导航系统中&#xff0c;载波、测距码和导航电文是构成GPS信号的三个基本组成部分&#xff0c;它们共同工作以实现精确的卫星定位和导航功能。以下是对这三个组成部分的详细介绍&#xff1a; 1. 载波&#xff08;Carrier&#xff09;&…...

deepE 定位系统卡顿问题实战(一) ----------- 锁造成的阻塞问题

deepE介绍 deepE是一个开源的用于端侧(自动驾驶车,机器人)等环境的系统问题与性能分析工具。基于ebpf功能实现 deepE项目地址 欢迎star 测试程序 #include <iostream> #include <thread> #include <mutex>static std::mutex lock;void func1() {int l…...

YOLOv5改进 | 主干网络 | ODConv + ConvNeXt 增强目标特征提取能力

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 …...

TIA博途WinCC通过VB脚本从 Excel中读取数据的具体方法介绍

TIA博途WinCC通过VB脚本从 Excel中读取数据的具体方法介绍 添加 一个PLC,设置PLC的IP地址,如下图所示, 添加全局DB块,新建几个变量,如下图所示, 在数据块中添加了 tag1 …… tag6 ,共 6 个浮点数类型的变量,用来接收通过 WinCC 从 Excel 文件中读取的数据。 添加 HMI…...

第5篇 区块链的技术架构:节点、网络和数据结构

区块链技术听起来很高大上&#xff0c;但其实它的核心架构并不难理解。今天我们就用一些简单的例子和有趣的比喻&#xff0c;来聊聊区块链的技术架构&#xff1a;节点、网络和数据结构。 节点&#xff1a;区块链的“细胞” 想象一下&#xff0c;区块链就像是一个大型的组织&a…...

vue长列表,虚拟滚动

1.新建子组件&#xff0c;将数据传递过去(几万条数据的数组&#xff0c;一次性展示多少条&#xff0c;每条数据的行高). <template><div class"vitualScroll"><sub-scroll :dataList"dataList" :rowCount"20" :rowHeight"2…...

【实战场景】记一次UAT jvm故障排查经历

【实战场景】记一次UAT jvm故障排查经历 开篇词&#xff1a;干货篇&#xff1a;1.查看系统资源使用情况2.将十进制进程号转成十六进制3.使用jstack工具监视进程的垃圾回收情况4.输出指定线程的堆内存信息5.观察日志6.本地环境复现 总结篇&#xff1a;我是杰叔叔&#xff0c;一名…...

线性代数--行列式1

本篇来自对线性代数第一篇的行列式的一个总结。 主要是行列式中有些关键点和注意事项&#xff0c;便于之后的考研复习使用。 首先&#xff0c;对于普通的二阶和三阶行列式&#xff0c;我们可以直接对其进行拆开&#xff0c;展开。 而对于n阶行列式 其行列式的值等于它的任意…...

tensorflow神经网络

训练一个图像识别模型&#xff0c;使用TensorFlow&#xff0c;需要以下步骤。 1. 安装所需的库 首先&#xff0c;确保安装了TensorFlow和其他所需的库。 pip install tensorflow numpy matplotlib2. 数据准备 需要收集和准备训练数据。每个类别应有足够多的样本图像。假设有…...

Python基础001

Python输出语句 print输出字符串 print("中国四大名著&#xff1a;","西游记|","三国演义|","红楼梦|","水浒传") print(6) print(1 1)Python输入语句 input函数 input() input("我的名字是&#xff1a;") p…...

【udp报文】udp报文未自动分片,报文过长被拦截问题定位

问题现象 某局点出现一个奇怪的现象&#xff0c;客户端给服务端发送消息&#xff0c;服务端仅能收到小部分消息&#xff0c;大部分消息从客户端发出后&#xff0c;服务端都未收到。 问题定位 初步分析 根据现象初步分析&#xff0c;有可能是网络原因导致消息到服务端不可达&a…...

某网页gpt的JS逆向

原网页网址 (base64) 在线解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果图 调用代码&#xff08;复制即用&#xff09; 把倒数第三行换成下面的base64解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…...

【python脚本】批量检测sql延时注入

文章目录 前言批量检测sql延时注入工作原理脚本演示 前言 SQL延时注入是一种在Web应用程序中利用SQL注入漏洞的技术&#xff0c;当传统的基于错误信息或数据回显的注入方法不可行时&#xff0c;例如当Web应用进行了安全配置&#xff0c;不显示任何错误信息或敏感数据时&#x…...

在C++中如何理解const关键字的不同用法(如const变量、const成员函数、const对象等)

在C中&#xff0c;const关键字是一个非常重要的修饰符&#xff0c;它用于指明变量、函数参数、成员函数或对象的内容是不可变的。理解const的不同用法对于编写高质量、易维护的C代码至关重要。下面详细解释const在几种不同上下文中的用法和含义。 1. const变量 当变量被声明为…...

JavaSEJava8 时间日期API + 使用心得

文章目录 1. LocalDate2. LocalTime3. LocalDateTime3.1创建 LocalDateTime3.2 LocalDateTime获取方法 4. LocalDateTime转换方法4.1 LocalDateTime增加或者减少时间的方法4.2 LocalDateTime修改方法 5. Period6. Duration7. 格式转换7.1 时间日期转换为字符串7.2 字符串转换为…...

IDEA中使用Maven打包及碰到的问题

1. 项目打包 IDEA中&#xff0c;maven打包的方式有两种&#xff0c;分别是 install 和 package &#xff0c;他们的区别如下&#xff1a; install 方式 install 打包时做了两件事&#xff0c;① 将项目打包成 jar 或者 war&#xff0c;打包结果存放在项目的 target 目录下。…...

KIVY 3D Rotating Monkey Head¶

3D Rotating Monkey Head — Kivy 2.3.0 documentation KIVY 3D Rotating Monkey Head kivy 3D 旋转猴子头 This example demonstrates using OpenGL to display a rotating monkey head. This includes loading a Blender OBJ file, shaders written in OpenGL’s Shading…...

14-26 剑和侠客 – 预训练模型三部曲3 – 机器人时代来临

概述 在第 1 部分和第 2 部分中&#xff0c;我们讨论了适用于文本和图像任务的预训练模型&#xff0c;并探索了当今常用的模型。我们分析了这些模型的架构以及如何将它们用于特定任务。实现 AGI 所需的两个主要支柱是语言理解和机器的视觉能力。有许多任务与这两种能力有关。 …...

layui-按钮

1.用法 使用 用button标签 type"button" class"layui-button" 效果&#xff1a; 2.主题设置 前面都要加上layui-bin 3.尺寸设置 可以叠加使用&#xff01; 4.圆角设置 加一个layui-bin-radius 5.按钮图标设置 里面加一个i标签 加class"layui-…...

ArcGIS Pro SDK (七)编辑 9 使用草图

ArcGIS Pro SDK &#xff08;七&#xff09;编辑 9 使用草图 文章目录 ArcGIS Pro SDK &#xff08;七&#xff09;编辑 9 使用草图1 切换草图选择模式2 聆听草图修改事件3 收听草图完成前事件并修改草图4 收听草图完成事件5 触发草图事件的自定义构造工具6 自定义自定义草图工…...

tomcat8.5在windows下运行出现日志中文乱码

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…...

东风奕派eπ008岚图FREE318双星闪耀

6月14日晚,东风汽车在湖北武汉和四川雅安两地同步举行盛大发布会,旗下两款重磅新能源车型——东风奕派的eπ008和东风岚图的FREE 318正式上市。这两款新车的推出,不仅进一步巩固了东风汽车在新能源市场的领先地位,也为消费者带来了更加多元化的选择和无与伦比的驾驶体验。e…...

福建聚鼎科技:装饰画生意到底有没有前景

在当今社会&#xff0c;随着人们生活水平的提高和审美需求的多样化&#xff0c;家居装饰行业迎来了新的发展机遇。装饰画作为家居装饰的重要组成部分&#xff0c;其市场前景备受关注。那么&#xff0c;装饰画生意到底有没有前景呢? 从市场需求的角度来看&#xff0c;装饰画市场…...

C++学习---string模拟实现(2)

1.随机插入一个字符串 &#xff08;1&#xff09;insert函数插入一个字符的方法我们在之前的模拟实现里面已经搞过了&#xff0c;那个里面要注意的是这个全体向后挪动的循环过程&#xff0c;这个里面我们要实现的是插入字符串的模拟实现&#xff1b; &#xff08;2&#xff0…...

总结 HTTP 协议的基本格式

一、HTTP 是什么 HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议 . HTTP 诞生与 1991 年 . 目前已经发展为最主流使用的一种应用层协议 . HTTP 协议目前有三个大版本: HTTP / 1 和 HTTP / 2 都是基于TCP 传输控制协议传输数据。最新版本的…...

境外间谍机构恐吓国内专家强迫“合作”,详情披露→

随着我国综合国力不断提升,国际合作交流项目逐渐增多,一些国内专家学者因工作需要经常赴境外考察、开展实地调研,努力拓宽研究渠道,谋求共同发展。与此同时,境外间谍情报机关高度关注我专家学者出国(境)情况,甚至伺机以威胁恐吓等卑劣手段进行拉拢策反,妄图窃取我国家…...

用ai写的rap情歌

Verse 1: 我想对你说&#xff0c;你是我的唯一 每一天都想和你在一起 你的微笑让我心跳加速 我想和你一起走过每一个路口 Chorus: 你是我的女神&#xff0c;我的爱人 我会一直陪伴你到永远 我们的爱情像火焰般燃烧 我会用我的生命来守护你 Verse 2: 我们的故事从相遇开始 每一…...