Spring Data JPA 资料总结

奇文共欣赏,疑义相与析。

前言:

          纵观市场上的ORM框架,Mybatis以灵活著称,但要维护复杂的配置,并且不是Spring官方的天然全家桶,Hibernate以HQL和关系映射著称,但是用起来不灵活。

Spring Data JPA与SpringBoot搭配起来有天然的优势,越来越多的开发从Spring、Mybatis开发转向SpringBoot、Spring Cloud、Spring Data等Spring全家桶开发。

一、Spring Data JPA 主要类以及结构图

(1)7个Repository接口以及2个实现类:

类名

接口/实现类

包名

Repository
接口
org.springframework.data.jpa.repository
CrudRepository
接口
org.springframework.data.jpa.repository
PagingAndSortingRepository
接口
org.springframework.data.jpa.repository
QueryByExampleExecutor接口
org.springframework.data.jpa.repository.query
JpaRepository
接口
org.springframework.data.jpa.repository
JpaSpecificationExecutor接口
org.springframework.data.jpa.repository
QueryDslPredicateExecutor接口
org.springframework.data.querydsl
SimpleJpaRepository实现类
org.springframework.data.jpa.repository.support
QueryDslJpaRepository实现类
org.springframework.data.jpa.repository.support
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一起使用

(8) @CreateDate等注解的使用

(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的构建器对象

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值