1.JDBC的理解
以前Java应用程序连接数据库需要使用各个数据库提供的接口
JDBC就是连接数据库的一组规范,接口标准,每个数据库厂商只需要实现这个JDBC接口就可以,JDBC的实现也就是数据库驱动
2.JPA是什么
JPA:用于对象持久化的API,统一Java应用程序访问各个orm框架的方式。全程使用注解
JPA与hibernate的关系
JPA使用需要配置其实现产品(eg:hibernate)
若JPA项目中只有一个JPA实现产品,则也可以不配置该节点
创建一个持久化类,使用注解描述持久化类与数据表(库)的对应关系
main方法测试:
1.创建EntitymanagerFactory
2.创建EntityManager
3.开启事务
4.进行持久化操作
5.提交事务
6.关闭EntityManager
7.关闭EntityManagerFactory
JPA的基本注解
指定Date类型在数据表里面的列类型
JPA的API
find()方法类似于 hibernate的 get()方法 即使对象没有被使用也会发送sql语句去数据库里面查询出来
getReference()方法类似于 hibernate的 load()方法,获得 的对象在未使用之前产生的是代理对象(不会发送sql语句去数据库里面查)
代理对象,就有可能会出现懒加载异常的问题。在使用这个对象之前关闭了entity manager,就会出现懒加载异常的问题
persist()方法类似于 hibernate的 save()方法,使对象由临时状态变为持久化状态。
和hibernate的save方法的不同之处,若对象有id,则不能指向insert 操作,会抛出异常
remove()方法类似于 hibernate中 session的 delete()方法,把对象对应的记录从数据库中移除,但注意,该方法只能移除 持久化 方法 ,而hibernate的 delete方法 实际上还可以移除 游离对象。
所以remove方法 先将对象查询出来 再删除 游离对象 数据库里面有记录 但是与session不关联
Merger方法
相当于saveOrUpdate 方法()
1.若传入的是一个临时对象(没有id)
会创建一个新对象,把临时对象的属性复制到新的对象中,然后对新 的对象进行持久化操作,所以新的对象中有id,但以前的临时对象中没有id
2.若传入的是一个游离对象,即传入的对象有oid,
在entitymanager 缓存中没有该对象
数据库中也没有对应的额记录
jpa会创建一个新对象 然后把游离对象的属性复制到新创建的对象中
对新对象执行insert操作
JPA事务管理
映射关联关系
保存多对一时,建议先保存1的一端,后保存n的一端,这样不会多出额外的update语句
Spring整合JPA
获取跟当前事务绑定的session
如何获取和当前事务关联的 EntityManager 对象 @persistenceContext
Spring Data & JPA
实体类用JPA映射 使用spring data 访问数据库
Spring Data
1.Repository是一个空接口,即是一个标记接口
2.若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean (代理对象) 纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法。
3.实际上也可以通过一个注解 @RepositoryDefinition 来替代继承 Repository
泛型 处理持久化类的类型 主键类型
Repository方法定义的规范
1.在Repository子接口中声明方法 不是随便声明的 而需要符合一定的规范
2.支持属性的级联查询。若当前类有符合条件的属性,则优先使用,而不是使用级联属性
若需要使用级联属性,则属性之间用 _ 进行连接
按照规范定义方法
使用springdata提供的关键字和实体类属性进行方法的命名。
getByLastNameStartingWithAndIdLessThan
(优点:简单易识别)
(缺点:方法名太长,不能实现复杂的查询)
此时就可以使用@Query注解
可以使用原生sql查询
@Query注解不支持DDL操作
必须添加@modifying注解,在调用的地方必须加事务,没有事务不能正常执行
Repository的第一个子接口CrudRepository
接口中的方法 save()批量保存 传入一个集合
Repository的第二个子接口PagingAndSortingRepository接口 分页排序有关的接口
findall(Pageable) 分页相关的
排序相关的
JpaRepository 接口 findAndFlush
JpaSpecificationExecutor接口
通用的带查询的分页
查询方法解析的流程
自定义repository接口 通常需要继承 JpaRepository 和 JpaSpecificationExecutor
可以使用 spring data 提供的大多数 增删改查方法 分页和带条件的查询方法
可以满足项目中的大部分需要
如果不够 还可以通过 @Query @Modefying 注解 使用自定义的 JPQL 语句
再不够 添加自定义方法