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进行了进一步封装。
Spring Data 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)

多表查询