介紹Spring Data Common里面的公用基本方法
(1)Spring Data Common的Repository
Repository位於Spring Data Common的lib里面,是Spring Data里面做數據庫操作的最底層的抽象接口、最頂級的父類,源碼里面其實什么方法都沒有,僅僅起到一個標識作用。管理域類以及域類的id類型作為類型參數,此接口主要作為標記接口捕獲要使用的類型,並幫助你發現擴展此接口的接口。Spring底層做動態代理的時候發現只要是它的子類或者實現類,都代表儲存庫操作
Repository的源碼如下
有了這個類,我們就能順藤摸瓜,找到好多Spring Data JPA提供的基本接口和操作類,及其實現方法。這個接口定義了所有Repostory操作的實體和ID兩個泛型參數。我們不需要繼承任何接口,只要繼承這個接口,就可以使用Spring JPA里面提供的很多約定的方法查詢和注解查詢。
(2)CrudRepository方法詳解
通過類關系圖可以看到CrudRepository提供了公共的通用的CRUD方法。
CrudRepository interface內容
(1)保存實體方法。我們通過剛才的類關系查看其他實現類。SimpleJpaRepository里面的實現方法
我們發現它是先檢查傳進去的實體是不是存在,然后判斷是新增還是更新;是不是存在兩種根據機制,一種是根據主鍵來判斷,另一種是根據Version來判斷(后面講解Version的時候詳解)。如果我們去看JPA控制台打印出來的SQL,最少會有兩條,一條是查詢,一條是insert或者update。
(2)批量保存。原理和步驟(1)相同。實現方法就是for循環調用上面的save方法。
(3)根據主鍵查詢實體。
(4)根據主鍵判斷實體是否存在。
(5)查詢實體的所有列表。
(6)根據主鍵列表查詢實體列表。
(7)查詢總數。
(8)根據主鍵刪除。我們通過剛才的類關系查看其他實現類。SimpleJpaRepository里面的實現方法:
我們看到JPA會先去查詢一下,再做保存,不存在拋出異常。這里特別強調一下delete和save方法,因為在實際工作中有的人會畫蛇添足,自己先去查詢再做判斷處理,其實Spring JPA底層都已經考慮到了。
(3)PagingAndSortingRepository方法詳解
通過類的關系圖,我們可以看到PagingAndSortingRepository繼承CrudRepository所有的基本方法,它增加了分頁和排序等對查詢結果進行限制的基本的、常用的、通用的一些分頁方法。
PagingAndSortingRepository interface內容
(1)根據排序取所有對象的集合。
(2)根據分頁和排序進行查詢,並用Page對象封裝。Pageable對象包含分頁和Sort對象。
PagingAndSortingRepository和CrudRepository都是Spring Data Common的標准接口,如果我們采用JPA,那它對應的實現類就是Spring Data JPA的model里面的SimpleJpaRepository。如果是其他NoSQL的實現Mongodb,那它的實現就在Spring Data Mongodb的model里面。
(4)JpaRepository方法詳解
JpaRepository到這里可以進入分水嶺了,上面的那些都是Spring Data為了兼容NoSQL而進行的一些抽象封裝,從JpaRepository開始是對關系型數據庫進行抽象封裝。從類圖可以看得出來它繼承了PagingAndSortingRepository類,也就繼承了其所有方法,並且實現類也是SimpleJpaRepository。從類圖上還可以看出JpaRepository繼承和擁有了QueryByExampleExecutor的相關方法。
通過源碼和CrudRepository相比較,它支持Query By Example,批量刪除,提高刪除效率,手動刷新數據庫的更改方法,並將默認實現的查詢結果變成了List。
(5)Repository的實現類SimpleJpaRepository
SimpleJpaRepository是JPA整個關聯數據庫的所有Repository的接口實現類。如果想進行擴展,可以繼承此類,如QueryDsl的擴展,還有默認的處理機制。如果將此類里面的實現方法看透了,基本上JPA的API就能掌握大部分。同時也是Spring JPA動態代理的實現類,包括我們后面講的Query Method。