奇文共欣赏,疑义相与析。
前言:
纵观市场上的ORM框架,Mybatis以灵活著称,但要维护复杂的配置,并且不是Spring官方的天然全家桶,Hibernate以HQL和关系映射著称,但是用起来不灵活。
Spring Data JPA与SpringBoot搭配起来有天然的优势,越来越多的开发从Spring、Mybatis开发转向SpringBoot、Spring Cloud、Spring Data等Spring全家桶开发。
一、Spring Data JPA 主要类以及结构图
(1)7个Repository接口以及2个实现类:
类名 | 接口/实现类 | 包名 |
---|---|---|
| 接口 | |
| 接口 | |
| 接口 | |
QueryByExampleExecutor | 接口 | |
| 接口 | |
JpaSpecificationExecutor | 接口 | |
QueryDslPredicateExecutor | 接口 | |
SimpleJpaRepository | 实现类 | |
QueryDslJpaRepository | 实现类 | |
CrudRepository实现接口:
PagingAndSortingRepository实现接口:
QueryByExampleExecutor实现接口:
JpaRepository实现接口:
JpaSpecificationExecutor实现接口:
⚠️ CrudRepository接口的delete(Iterable<? extends T> entities) 是一条条删,JpaRepository的deleteInBatch(Iterable<T> entities),deleteAllInBatch()是批量删除从而提高删除效率。
然而CrudRepository和JpaRepository的save(Iterable<S> entities)都不是批量添加,而是一条条添加,如果觉得效率低可以开线程去操作。
原因如下:(Jpa每添加一条数据就要判断当前数据是不是新数据,是新数据才添加,不是新数据就去修改数据)
(2)关系结构图
(3)真正的JPA底层封装类
类名 | 包名 |
---|---|
EntityManager | javax.persistence |
EntityManagerImpl | org.hibernate.jpa.internal |
二、注解的使用
(1) @Entity等基本注解
(2) @Param注解的使用
(3)@Modifying 这个就是在delete or update的时候重写SQL的时候加上的,实现如上图
⚠️ 只要在 delete or update 的时候才需要写这个注解,query 的时候写会报错的!!!!!
(4) @Query注解的使用
(5) @JoinColumn注解主要配合@OneToOne,@OneToMany,@ManyToOne等关联关系注解使用,单独使用没有意义
(6) @OneToOne,@OneToMany,@ManyToOne:http://pms.ipo.com/pages/viewpage.action?pageId=108856361
(7) @OrderBy 排序 , 一般和@OneToMany一起使用
(9) @EntityGraph、@NamedEntityGraph、@NamedAttributeNode 注解的使用:http://pms.ipo.com/pages/viewpage.action?pageId=108856361
(10) @Version乐观锁
三、JPA查询以及使用技巧
(1) 关键字列表查询
如果想要深入了解一下的话可以看一下PartTree.java源码。
例如,查询除了find前缀外也可以使用read、get等前缀
(2)方法的查询策略的属性表达式
(3) 分页与排序
Page 继承了 Slice。。。。。。,不用关心有多少页的话就可以用Slice !!
⚠️ 只要入参是Pageable返回参数是Page的必定会查一次count, 而入参是Pageable返回参数是Slice的不会查询一次count。
(4) 限制查询结果
(5) 流式查询结果 参考官网:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-streaming
⚠️注解 @Transactional(readOnly = true) 一定不能少,否则会报错,这个一点官网并没有强调!!是我自己测试出来的,报错如下:
(6)异步查询
(7) 调用EntityManger类封装的方法自己写SQL, 不使用JPA
(8) 使用QueryByExampleExecutor查询
可以看到ExampleMatcher实现类里面包含类很多查询方法,以下只截取了部分!!!具体想了解的童鞋可以自己查看这个类。
(9) JpaSpecificationExecutor 查询
这个接口就是围绕着Specification接口来定义的,Specification接口只有以下一个方法。
该方法的入参有Root,CriteriaQuery,CriteriaBuilder
Root: 代表来可以查询或操作的实体对象的根
CriteriaQuery:代表一个顶层查询对象,包括select,where,having,orderBy,groupBy,提供了查询root的方法
CriteriaBuilder:用来构建CriteriaQuery的构建器对象