摘要:它們之間的關系如下類如其名,可以勝任最基本的操作。在中,僅需加入對象即可達到分頁的效果。則進一步在的基礎上,擴展了部分功能查詢列表返回值為批量刪除強制同步查詢這部分將在以后的內容中不斷細化。
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查詢
這部分將在以后的內容中不斷細化。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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提供了一個創建項目腳手架的官...
閱讀 2265·2021-09-27 13:35
閱讀 561·2019-08-30 15:55
閱讀 809·2019-08-30 15:53
閱讀 554·2019-08-30 15:52
閱讀 2145·2019-08-30 12:59
閱讀 2268·2019-08-29 16:42
閱讀 1384·2019-08-26 18:26
閱讀 2466·2019-08-26 13:48