摘要:它們之間的關(guān)系如下類如其名,可以勝任最基本的操作。在中,僅需加入對象即可達(dá)到分頁的效果。則進(jìn)一步在的基礎(chǔ)上,擴(kuò)展了部分功能查詢列表返回值為批量刪除強(qiáng)制同步查詢這部分將在以后的內(nèi)容中不斷細(xì)化。
Repository的概念
在Spring中有Repository的概念,repository原意指的是倉庫,即數(shù)據(jù)倉庫的意思。Repository居于業(yè)務(wù)層和數(shù)據(jù)層之間,將兩者隔離開來,在它的內(nèi)部封裝了數(shù)據(jù)查詢和存儲的邏輯。這樣設(shè)計(jì)的好處有兩個(gè):
降低層級之間的耦合:更換、升級ORM引擎(Hibernate)并不會影響業(yè)務(wù)邏輯
提高測試效率:如果在測試時(shí)能用Mock數(shù)據(jù)對象代替實(shí)際的數(shù)據(jù)庫操作,運(yùn)行速度會快很多
Repository和DAO的區(qū)別DAO是傳統(tǒng)MVC中Model的關(guān)鍵角色,全稱是Data Access Object。DAO直接負(fù)責(zé)數(shù)據(jù)庫的存取工作,乍一看兩者非常類似,但從架構(gòu)設(shè)計(jì)上講兩者有著本質(zhì)的區(qū)別:
Repository蘊(yùn)含著真正的OO概念,即一個(gè)數(shù)據(jù)倉庫角色,負(fù)責(zé)所有對象的持久化管理。DAO則沒有擺脫數(shù)據(jù)的影子,仍然停留在數(shù)據(jù)操作的層面上。Repository是相對對象而言,DAO則是相對數(shù)據(jù)庫而言,雖然可能是同一個(gè)東西 ,但側(cè)重點(diǎn)完全不同。
三種Repository介紹在Spring和Spring Data JPA中,有三種Repository接口方便開發(fā)者直接操作數(shù)據(jù)倉庫。
它們之間的關(guān)系如下:
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方法在可兩用,參數(shù)中不存在主鍵時(shí)執(zhí)行insert操作,存在主鍵則執(zhí)行update操作,相當(dāng)于是一個(gè)upsert操作。
PagingAndSortingRepositoryIterablefindAll(Sort sort); Page findAll(Pageable pageable);
PagingAndSortingRepository繼承了CrudRepository接口,增加了分頁和排序的方法。
分頁
要達(dá)到分頁的目的,需要傳入一個(gè)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注解,表明了需要傳入U(xiǎn)RL參數(shù)page和size,用于計(jì)算分頁的offset值。
PageRequest是Pageable的實(shí)現(xiàn)類,傳入初始化page和size即可生成分頁參數(shù)。
在Service中,僅需加入pageable對象即可達(dá)到分頁的效果。代碼如下:
public IterablegetUserList(Pageable pageable) { return userRepo.findAll(pageable); }
此時(shí)在POSTMAN中輸入訪問地址:"127.0.0.1:8080/user?page=0&size=5",得到以下結(jié)果:
{ "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 }
從結(jié)果可以看出,不僅在content中有查詢的數(shù)組信息,還包括totalPages等分頁信息。
排序
與分頁類似,要達(dá)到排序的目錄,僅需要傳入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); }
此時(shí)在POSTMAN中輸入訪問地址:"127.0.0.1:8080/user",得到以下結(jié)果:
[ { "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排序的結(jié)果列表
排序后分頁
PagingAndSortingRepository提供了分頁和排序的接口,那如果兩者都要做,該怎么寫呢?
其實(shí)在Pageable中,還可以傳入Sort屬性,這樣就可以在分頁中達(dá)到排序的目的。
同樣的,把Controller代碼稍稍調(diào)整一下:
@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的第三個(gè)參數(shù)傳入。
這樣調(diào)整以后,UserService這邊就不在需要入?yún)镾ort的getUserList接口了。
此時(shí)在POSTMAN中輸入訪問地址:"127.0.0.1:8080/user?page=0&size=5",得到以下結(jié)果:
{ "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顯然不應(yīng)該出現(xiàn)在應(yīng)答結(jié)果中,以后的代碼會將它去除出去。
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則進(jìn)一步在PagingAndSorting的基礎(chǔ)上,擴(kuò)展了部分功能:
查詢列表(返回值為List)
批量刪除
強(qiáng)制同步
Example查詢
這部分將在以后的內(nèi)容中不斷細(xì)化。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70739.html
摘要:用于管理數(shù)據(jù)實(shí)體及持久化相關(guān)的處理,則是整個(gè)業(yè)務(wù)的核心。首先,對于的每個(gè)接口,我們在中定義對應(yīng)請求接收方法說明注解,表明這個(gè)專門用于服務(wù),返回值不是傳統(tǒng)的數(shù)據(jù)。對于來講,僅僅是一個(gè)簡單的繼承了的接口。 開發(fā)配置 依賴包準(zhǔn)備 這里選用mysql作為數(shù)據(jù)庫,需要用到的包有三個(gè),需要將相關(guān)依賴寫入pom.xml,如下: org.springframework.boot ...
摘要:本文參考官方文檔部分特定版本如版本官方文檔地址注本文基于構(gòu)建話說在上已經(jīng)有多顆星了,足見火爆程度簡介以下介紹引自創(chuàng)建獨(dú)立的應(yīng)用程序直接嵌入,或無需部署文件提供自己的入門來簡化你的配置盡可能自動配置提供生產(chǎn)就緒功能,如指標(biāo),運(yùn)行 本文參考 Spring Boot官方文檔 Part II. Getting Started部分特定版本如1.5.10.RELEASE版本官方文檔地址:https...
摘要:總結(jié)基于構(gòu)建相對來說還是比較便捷的,其中注解使得代碼更加簡潔,本次用到注解再匯總下,有時(shí)間的話可以深入理解下其背后的原理申明讓自動給程序進(jìn)行必要的配置。風(fēng)格的控制器提供路由信息,負(fù)責(zé)到中的具體函數(shù)的映射一般用于修飾層的組件自動導(dǎo)入依賴的 本文主要記錄搭建RESTful API標(biāo)準(zhǔn)工程,包含比較推薦的工程結(jié)構(gòu),掌握一些基本注解,并引入Swagger 新建一個(gè)項(xiàng)目 通過Spring Ini...
摘要:關(guān)閉進(jìn)程問題順利解決。問題泄也是一個(gè)奇葩的問題,百度一下,原來碰到的人挺多,原因就是高版本的驅(qū)動會有數(shù)據(jù)庫和系統(tǒng)時(shí)區(qū)差異我用的版本是,所以碰到了,修改下配置,執(zhí)行時(shí)區(qū)就可以了或者用回版本,該版本不會存在時(shí)區(qū)問題。 本文主要在上一篇Spring Boot學(xué)習(xí)筆記(四)構(gòu)建RESTful API標(biāo)準(zhǔn)工程實(shí)例的基礎(chǔ)上,整合MyBatis,實(shí)現(xiàn)簡單的MySql數(shù)據(jù)庫訪問 引入依賴 這里主要依賴...
摘要:創(chuàng)建工程將框架代碼包解壓后放到工作目錄。方便起見,本教程使用為例。添加創(chuàng)建一個(gè),負(fù)責(zé)響應(yīng)相關(guān)的業(yè)務(wù)請求。添加標(biāo)注在中,對輸入?yún)?shù)進(jìn)行校驗(yàn)通常使用標(biāo)注。在本教程,我們將實(shí)現(xiàn)的增和查的工作。創(chuàng)建用戶用戶名重啟并提交創(chuàng)建請求。 環(huán)境準(zhǔn)備 系統(tǒng):MacOS 開發(fā):IntelliJ IDEA 語言:Java8 其它:Mysql、Redis 腳手架代碼 Spring提供了一個(gè)創(chuàng)建項(xiàng)目腳手架的官...
閱讀 2285·2021-09-27 13:35
閱讀 571·2019-08-30 15:55
閱讀 824·2019-08-30 15:53
閱讀 570·2019-08-30 15:52
閱讀 2159·2019-08-30 12:59
閱讀 2284·2019-08-29 16:42
閱讀 1450·2019-08-26 18:26
閱讀 2483·2019-08-26 13:48