Spring Data Jpa 学习笔记
JPA 简介
JPA是一种规范,Hibernate除了是ORM框架之外,他还是JPA的一种实现。JPA只定义了接口和抽象方法,他需要Hibernate提供实现类完成数据持久化工作。
JPA 对事物的支持
- JTA 分布式事务
- RESOURC_LOCAL 本地事务
JPA 执行持久化过程
- 加载配置文件创建实体管理器工厂对象(EntityManagerFactory)
- 通过实体管理器工厂获取实体管理器(EntityManager)
- 通过实体管理器获取事务对象
- 开启事务
- 进行CURD操作
- 提交事务
- 释放资源(关闭实体管理器、关闭实体管理器工厂)
Spring Data JPA 简介
Spring Data JPA 对JPA进行了进一步封装。
使用
dao 包中定义接口需要继承一下两个接口:
- JpaRespoRepository<操作的实体类类型,实体类中主键的类型>
封装了基本的CURD操作 - JpaSpeciSpecificationExecutor<操作的实体类类型>
封装了复杂查询(分页等)
原理分析
我们只定义了接口并没有定义接口的实现类,Spring Data JPA 是如何进行数据访问操作的呢?
其实在程序的执行过程中,框架自动的帮我们实现了接口的实现对象。即通过动态代理的方式生成基于接口的实体类对象。
getOne 和findOne的区别
- getOne 延迟加载,返回动态代理对象,什么时候用什么时候查询
- findOne 立即加载
Jpql 查询方式
- 需要在接口类上加注解配置方法
- 查询 @Query(value=" from EntityName where column1=?1 and column2= ?2")
- 更新/删除:dao包方法上加 @Query(value=“update EntityName set column1 = ?1 where column2 =?2)” 、@Modifying 、调用此方法的service方法加注解 @RolRollBack(value = false) 、@Transactional
sql 查询方式
- @Query(value=“sql”,nativeQuery = true)
方法命名规则查询
- 唯一查询:findBy+属性名(属性名):findByName(String name)
- 模糊查询:findBy+属性名+查询方式(like|isnull)(): findByNameLike()
- 多条件:findBy+属性名+查询方式+条件连接符(and|or)+属性名 + 查询方式:findByNameAndAge(String name,String age)