1.什麼是spring data jpa
spring data jpa 是 spring 基於ORM 架構、jpa規範的基礎上封裝的一套jpa應用程式框架,可使開發人員用極簡的代碼即可實現對資料的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易於擴充。學習並使用 spring data jpa 可以極大提高開發效率。
基本上所有CRUD都可以依賴於它來實現。
2.使用方法
在pom.xml中加入依賴
Dao繼承JpaRepository
spring data jpa 預設預先產生了一些基本的CURD的方法,例如:增、刪、改等等 預設方法有:
spring data jpa 重要的地方是可以自訂簡單查詢,即為根據方法名來自動產生sql,例子如下:
上圖的方法即會產生的sql 語句為:
select * from tb_banner where shop_id = ?1 and flag = ?2 order by priority asc 一個更加長的方法。。。。。。
上圖的方法即會產生的sql語句為:
select * from tb_course where shop_id = ?1 and one_classify_id = ?2 and two_classify_id = ?3 and flag = ?4 具體的關鍵字,使用方法和生產成SQL如下表所示
分頁查詢 spring data jpa已經幫我們實現了分頁的功能,在查詢的方法中,需要傳入參數Pageable,一般我會將pageable作為最後一個參數。 使用方法
直接在controller層封裝好Pageable對象即可
@GetMapping("findBanners")public Page<Banner> findBanners(@PageableDefault(sort = {"priority"}, direction=Sort.Direction.ASC) Pageable pageable)
如果前端不傳page 和 size 這兩個參數過來,那麼@PageableDefault會預設為第1頁開始,每頁最大條數為10。需注意page為0時為第一頁。
接著,直接在service層調用即可
返回給用戶端的Page對象,其json格式為
{
“content”: [],//資料內容
“first”: true,//是否為第一頁
“last”: true,//是否為最後一頁
“number”: 0,//當前頁碼
“numberOfElements”: 0,//當前頁中的實際資料條數
“size”: 0,//一頁最大條數
“sort”: { },//排序資訊
“totalElements”: 0,//總條數
“totalPages”: 0//總頁數
}
你也可以自己手動建立Pageable對象
同時,通過Page.map方法,可以修改Page所含有的值。
convert方法將course集合中的每個course轉為courseSimpleVo
toCourseSimpleVo方法將Course類轉為CourseSimpleVo類
動態查詢
現在有下圖這種需求,需要通過不同的查詢條件查詢訂單
因為查詢參數的數量是不確定的,所以我們會在dao層寫很多方法,這是非常不理想的。
用排列組合的方式,上面有5個不確定的查詢參數,我們可能需要有30多種查詢方法,就如下圖
因此,這裡給出一個解決方案,利用spring data jpa 中的 Specification介面
針對上述問題,我們建立一個OrderSpec類,裡面建立查詢參數
註:當orderType 為 null 時,則不會出現在 SQL 查詢語句中
類似的,我們把其他參數也加上
時間這裡,做了空值處理
接著在Service層,即可建立查詢
自訂SQL查詢 其實Spring data 覺大部分的SQL都可以根據方法名定義的方式來實現,但是由於某些原因我們想使用自訂的SQL來查詢,spring data也是完美支援的;在SQL的查詢方法上面使用@Query註解,如涉及到刪除和修改需要加上@Modifying.也可以根據需要添加 @Transactional 對事物的支援等。
多表查詢
多表查詢在spring data jpa中有兩種實現方式,第一種是利用hibernate的級聯查詢來實現,第二種是建立一個結果集的介面來接收連表查詢後的結果,這裡主要第二種方式。
Spring data jpa 與 hibernate、mybatis 和其他持久層開源架構的關係
我的理解是:雖然ORM架構都實現了JPA規範,但是在不同ORM架構之間切換是需要編寫的代碼有一些差異,而通過使用Spring Data Jpa能夠方便大家在不同的ORM架構中間進行切換而不要更改代碼。並且Spring Data Jpa對Repository層封裝的很好,可以省去不少的麻煩。