1.什么是spring data jpa
spring data jpa 是 spring 基于ORM 框架、jpa规范的基础上封装的一套jpa应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 spring data jpa 可以极大提高开发效率!
基本上所有CRUD都可以依赖于它来实现。
2.使用方法
在pom.xml中加入依赖
Dao继承JpaRepository
spring data jpa 默认预先生成了一些基本的CURD的方法,例如:增、删、改等等
默认方法有:
spring data jpa 重要的地方是可以自定义简单查询,即为根据方法名来自动生成sql,例子如下:
上图的方法即会生成的sql 语句为:
select * from tb_banner where shop_id = ?1 and flag = ?2 order by priority asc
一个更加长的方法。。。。。。
上图的方法即会生成的sql语句为:
select * from tb_course where shop_id = ?1 and one_classify_id = ?2 and two_classify_id = ?3 and flag = ?4
具体的关键字,使用方法和生产成SQL如下表所示
分页查询
spring data jpa已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable,一般我会将pageable作为最后一个参数。
使用方法
直接在controller层封装好Pageable对象即可
@GetMapping("findBanners")
public Page<Banner> findBanners(@PageableDefault(sort = {"priority"}, direction=Sort.Direction.ASC) Pageable pageable)
如果前端不传page 和 size 这两个参数过来,那么@PageableDefault会默认为第1页开始,每页最大条数为10。需注意page为0时为第一页。
接着,直接在service层调用即可
返回给客户端的Page对象,其json格式为
{
“content”: [],//数据内容
“first”: true,//是否为第一页
“last”: true,//是否为最后一页
“number”: 0,//当前页码
“numberOfElements”: 0,//当前页中的实际数据条数
“size”: 0,//一页最大条数
“sort”: { },//排序信息
“totalElements”: 0,//总条数
“totalPages”: 0//总页数
}
你也可以自己手动创建Pageable对象
同时,通过Page.map方法,可以修改Page所含有的值。
convert方法将course集合中的每个course转为courseSimpleVo
toCourseSimpleVo方法将Course类转为CourseSimpleVo类
动态查询
现在有下图这种需求,需要通过不同的查询条件查询订单
因为查询参数的数量是不确定的,所以我们会在dao层写很多方法,这是非常不理想的。
用排列组合的方式,上面有5个不确定的查询参数,我们可能需要有30多种查询方法,就如下图
因此,这里给出一个解决方案,利用spring data jpa 中的 Specification接口
针对上述问题,我们创建一个OrderSpec类,里面创建查询参数
注:当orderType 为 null 时,则不会出现在 sql 查询语句中
类似的,我们把其他参数也加上
时间这里,做了空值处理
接着在Service层,即可创建查询
自定义SQL查询
其实Spring data 觉大部分的SQL都可以根据方法名定义的方式来实现,但是由于某些原因我们想使用自定义的SQL来查询,spring data也是完美支持的;在SQL的查询方法上面使用@Query注解,如涉及到删除和修改需要加上@Modifying.也可以根据需要添加 @Transactional 对事物的支持等。
多表查询
多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果,这里主要第二种方式。
Spring data jpa 与 hibernate、mybatis 和其他持久层开源框架的关系
我的理解是:虽然ORM框架都实现了JPA规范,但是在不同ORM框架之间切换是需要编写的代码有一些差异,而通过使用Spring Data Jpa能够方便大家在不同的ORM框架中间进行切换而不要更改代码。并且Spring Data Jpa对Repository层封装的很好,可以省去不少的麻烦。