在Spring中有Repository的概念,repository原意指的是仓库,即数据仓库的意思。Repository居于业务层和数据层之间,将二者隔离开来,在它的内部封装了数据查询和存储的逻辑。这样设计的好处有两个:数据库
DAO是传统MVC中Model的关键角色,全称是Data Access Object。DAO直接负责数据库的存取工做,乍一看二者很是相似,但从架构设计上讲二者有着本质的区别:数组
Repository蕴含着真正的OO概念,即一个数据仓库角色,负责全部对象的持久化管理。DAO则没有摆脱数据的影子,仍然停留在数据操做的层面上。Repository是相对对象而言,DAO则是相对数据库而言,虽然多是同一个东西 ,但侧重点彻底不一样。架构
在Spring和Spring Data JPA中,有三种Repository接口方便开发者直接操做数据仓库。
它们之间的关系以下:app
<S extends T> S save(S entity); <S extends T> Iterable<S> save(Iterable<S> entities); T findOne(ID id); boolean exists(ID id); Iterable<T> findAll(); Iterable<T> findAll(Iterable<ID> 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操做。ide
Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable);
PagingAndSortingRepository继承了CrudRepository接口,增长了分页和排序的方法。测试
分页spa
要达到分页的目的,须要传入一个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<Object>(userService.getUserList(pageable), HttpStatus.OK); }
<说明>设计
在Service中,仅需加入pageable对象便可达到分页的效果。代码以下:code
public Iterable<User> getUserList(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<Object>(userService.getUserList(sort), HttpStatus.OK); }
一样的,在Service中须要新增接口,以下:
public Iterable<User> getUserList(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<Object>(userService.getUserList(pageable), HttpStatus.OK); }
<说明>
这样调整之后,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显然不该该出如今应答结果中,之后的代码会将它去除出去。
List<T> findAll(); List<T> findAll(Sort sort); List<T> findAll(Iterable<ID> ids); <S extends T> List<S> save(Iterable<S> entities); void flush(); <S extends T> S saveAndFlush(S entity); void deleteInBatch(Iterable<T> entities); void deleteAllInBatch(); T getOne(ID id); @Override <S extends T> List<S> findAll(Example<S> example); @Override <S extends T> List<S> findAll(Example<S> example, Sort sort);
JpaRepository则进一步在PagingAndSorting的基础上,扩展了部分功能:
这部分将在之后的内容中不断细化。