Spring Data Jpa (二)JPA基礎查詢

介紹Spring Data Common裏面的公用基本方法數據庫

(1)Spring Data Common的Repositorypost

  Repository位於Spring Data Common的lib裏面,是Spring Data裏面作數據庫操做的最底層的抽象接口、最頂級的父類,源碼裏面其實什麼方法都沒有,僅僅起到一個標識做用。管理域類以及域類的id類型做爲類型參數,此接口主要做爲標記接口捕獲要使用的類型,並幫助你發現擴展此接口的接口。Spring底層作動態代理的時候發現只要是它的子類或者實現類,都表明儲存庫操做代理

  Repository的源碼以下對象

  有了這個類,咱們就能順藤摸瓜,找到好多Spring Data JPA提供的基本接口和操做類,及其實現方法。這個接口定義了全部Repostory操做的實體和ID兩個泛型參數。咱們不須要繼承任何接口,只要繼承這個接口,就可使用Spring JPA裏面提供的不少約定的方法查詢和註解查詢。blog

 

 

(2)CrudRepository方法詳解  排序

  經過類關係圖能夠看到CrudRepository提供了公共的通用的CRUD方法。繼承

  CrudRepository interface內容接口

(1)保存實體方法。咱們經過剛纔的類關係查看其餘實現類。SimpleJpaRepository裏面的實現方法源碼

  

    咱們發現它是先檢查傳進去的實體是否是存在,而後判斷是新增仍是更新;是否是存在兩種根據機制,一種是根據主鍵來判斷,另外一種是根據Version來判斷(後面講解Version的時候詳解)。若是咱們去看JPA控制檯打印出來的SQL,最少會有兩條,一條是查詢,一條是insert或者update。it

(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。

相關文章
相關標籤/搜索