JPA&Spring Data

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 语句
再不够 添加自定义方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值