摘要:它们之间的关系如下类如其名,可以胜任最基本的操作。在中,仅需加入对象即可达到分页的效果。则进一步在的基础上,扩展了部分功能查询列表返回值为批量删除强制同步查询这部分将在以后的内容中不断细化。
Repository的概念
在Spring中有Repository的概念,repository原意指的是仓库,即数据仓库的意思。Repository居于业务层和数据层之间,将两者隔离开来,在它的内部封装了数据查询和存储的逻辑。这样设计的好处有两个:
降低层级之间的耦合:更换、升级ORM引擎(Hibernate)并不会影响业务逻辑
提高测试效率:如果在测试时能用Mock数据对象代替实际的数据库操作,运行速度会快很多
Repository和DAO的区别DAO是传统MVC中Model的关键角色,全称是Data Access Object。DAO直接负责数据库的存取工作,乍一看两者非常类似,但从架构设计上讲两者有着本质的区别:
Repository蕴含着真正的OO概念,即一个数据仓库角色,负责所有对象的持久化管理。DAO则没有摆脱数据的影子,仍然停留在数据操作的层面上。Repository是相对对象而言,DAO则是相对数据库而言,虽然可能是同一个东西 ,但侧重点完全不同。
三种Repository介绍在Spring和Spring Data JPA中,有三种Repository接口方便开发者直接操作数据仓库。
它们之间的关系如下:
S save(S entity);Iterablesave(Iterableentities); T findOne(ID id); boolean exists(ID id); IterablefindAll(); Iterable findAll(Iterable ids); long count(); void delete(ID id); void delete(T entity); void delete(Iterable extends T> entities); void deleteAll();
CrudRepository类如其名,可以胜任最基本的CRUD操作。其中save方法在可两用,参数中不存在主键时执行insert操作,存在主键则执行update操作,相当于是一个upsert操作。
PagingAndSortingRepositoryIterablefindAll(Sort sort); Page findAll(Pageable pageable);
PagingAndSortingRepository继承了CrudRepository接口,增加了分页和排序的方法。
分页
要达到分页的目的,需要传入一个Pageble接口对象,controller中代码如下:
@GetMapping("") public ResponseEntity> getList( @RequestParam(value="page", defaultValue="0") int page, @RequestParam(value="size", defaultValue="10") int size ) { Pageable pageable = new PageRequest(page, size); return new ResponseEntity
<说明>
@RequestParam注解,表明了需要传入URL参数page和size,用于计算分页的offset值。
PageRequest是Pageable的实现类,传入初始化page和size即可生成分页参数。
在Service中,仅需加入pageable对象即可达到分页的效果。代码如下:
public IterablegetUserList(Pageable pageable) { return userRepo.findAll(pageable); }
此时在POSTMAN中输入访问地址:"127.0.0.1:8080/user?page=0&size=5",得到以下结果:
{ "content": [ { "id": 12, "name": "F1" }, { "id": 13, "name": "A" }, { "id": 14, "name": "B" }, { "id": 15, "name": "C" }, { "id": 16, "name": "D" } ], "last": false, "totalPages": 3, "totalElements": 11, "size": 5, "number": 0, "numberOfElements": 5, "first": true, "sort": null }
从结果可以看出,不仅在content中有查询的数组信息,还包括totalPages等分页信息。
排序
与分页类似,要达到排序的目录,仅需要传入Sort对象即可,controller中代码如下:
@GetMapping("") public ResponseEntity> getList( @RequestParam(value="page", defaultValue="0") int page, @RequestParam(value="size", defaultValue="10") int size ) { Sort sort = new Sort(Sort.Direction.DESC, "name"); // Pageable pageable = new PageRequest(page, size); return new ResponseEntity
同样的,在Service中需要新增接口,如下:
public IterablegetUserList(Sort sort) { return userRepo.findAll(sort); }
此时在POSTMAN中输入访问地址:"127.0.0.1:8080/user",得到以下结果:
[ { "id": 22, "name": "K" }, { "id": 21, "name": "J" }, { "id": 20, "name": "I" }, { "id": 19, "name": "H" }, { "id": 18, "name": "G" }, { "id": 12, "name": "F1" }, { "id": 17, "name": "E" }, { "id": 16, "name": "D" }, { "id": 15, "name": "C" }, { "id": 14, "name": "B" }, { "id": 13, "name": "A" } ]
得到的正是name属性按DESC排序的结果列表
排序后分页
PagingAndSortingRepository提供了分页和排序的接口,那如果两者都要做,该怎么写呢?
其实在Pageable中,还可以传入Sort属性,这样就可以在分页中达到排序的目的。
同样的,把Controller代码稍稍调整一下:
@GetMapping("") public ResponseEntity> getList( @RequestParam(value="page", defaultValue="0") int page, @RequestParam(value="size", defaultValue="10") int size ) { Sort sort = new Sort(Sort.Direction.DESC, "name"); Pageable pageable = new PageRequest(page, size, sort); return new ResponseEntity
<说明>
Sort对象作为PageRequest的第三个参数传入。
这样调整以后,UserService这边就不在需要入参为Sort的getUserList接口了。
此时在POSTMAN中输入访问地址:"127.0.0.1:8080/user?page=0&size=5",得到以下结果:
{ "content":[ {"id":22,"name":"K"}, {"id":21,"name":"J"}, {"id":20,"name":"I"}, {"id":19,"name":"H"}, {"id":18,"name":"G"} ], "totalPages":3, "totalElements":11, "last":false,"size":5, "number":0, "first":true, "numberOfElements":5, "sort":[{ "direction":"DESC", "property":"name", "ignoreCase":false, "nullHandling":"NATIVE", "ascending":false, "descending":true }] }
sort显然不应该出现在应答结果中,以后的代码会将它去除出去。
JpaRepositoryListfindAll(); List findAll(Sort sort); List findAll(Iterable ids); Listsave(Iterableentities); void flush();S saveAndFlush(S entity); void deleteInBatch(Iterableentities); void deleteAllInBatch(); T getOne(ID id); @Override ListfindAll(Exampleexample); @OverrideListfindAll(Exampleexample, Sort sort);
JpaRepository则进一步在PagingAndSorting的基础上,扩展了部分功能:
查询列表(返回值为List)
批量删除
强制同步
Example查询
这部分将在以后的内容中不断细化。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70739.html
摘要:用于管理数据实体及持久化相关的处理,则是整个业务的核心。首先,对于的每个接口,我们在中定义对应请求接收方法说明注解,表明这个专门用于服务,返回值不是传统的数据。对于来讲,仅仅是一个简单的继承了的接口。 开发配置 依赖包准备 这里选用mysql作为数据库,需要用到的包有三个,需要将相关依赖写入pom.xml,如下: org.springframework.boot ...
摘要:本文参考官方文档部分特定版本如版本官方文档地址注本文基于构建话说在上已经有多颗星了,足见火爆程度简介以下介绍引自创建独立的应用程序直接嵌入,或无需部署文件提供自己的入门来简化你的配置尽可能自动配置提供生产就绪功能,如指标,运行 本文参考 Spring Boot官方文档 Part II. Getting Started部分特定版本如1.5.10.RELEASE版本官方文档地址:https...
摘要:总结基于构建相对来说还是比较便捷的,其中注解使得代码更加简洁,本次用到注解再汇总下,有时间的话可以深入理解下其背后的原理申明让自动给程序进行必要的配置。风格的控制器提供路由信息,负责到中的具体函数的映射一般用于修饰层的组件自动导入依赖的 本文主要记录搭建RESTful API标准工程,包含比较推荐的工程结构,掌握一些基本注解,并引入Swagger 新建一个项目 通过Spring Ini...
摘要:关闭进程问题顺利解决。问题泄也是一个奇葩的问题,百度一下,原来碰到的人挺多,原因就是高版本的驱动会有数据库和系统时区差异我用的版本是,所以碰到了,修改下配置,执行时区就可以了或者用回版本,该版本不会存在时区问题。 本文主要在上一篇Spring Boot学习笔记(四)构建RESTful API标准工程实例的基础上,整合MyBatis,实现简单的MySql数据库访问 引入依赖 这里主要依赖...
摘要:创建工程将框架代码包解压后放到工作目录。方便起见,本教程使用为例。添加创建一个,负责响应相关的业务请求。添加标注在中,对输入参数进行校验通常使用标注。在本教程,我们将实现的增和查的工作。创建用户用户名重启并提交创建请求。 环境准备 系统:MacOS 开发:IntelliJ IDEA 语言:Java8 其它:Mysql、Redis 脚手架代码 Spring提供了一个创建项目脚手架的官...
阅读 2264·2021-09-27 13:35
阅读 561·2019-08-30 15:55
阅读 809·2019-08-30 15:53
阅读 553·2019-08-30 15:52
阅读 2145·2019-08-30 12:59
阅读 2267·2019-08-29 16:42
阅读 1382·2019-08-26 18:26
阅读 2466·2019-08-26 13:48