在上篇文章 springboot(二):web綜合開發 中簡單介紹了一下spring data jpa的基礎性使用,這篇文章将更加全面的介紹spring data jpa 常見用法以及注意事項
使用spring data jpa 開發時,發現國内對spring boot jpa全面介紹的文章比較少案例也比較零碎,是以寫文章總結一下。本人也正在翻譯 spring data jpa 參考指南 ,有興趣的同學歡迎聯系我,一起加入翻譯中!
jpa(java persistence api)是sun官方提出的java持久化規範。它為java開發人員提供了一種對象/關聯映射工具來管理java應用中的關系資料。他的出現主要是為了簡化現有的持久化開發工作和整合orm技術,結束現在hibernate,toplink,jdo等orm架構各自為營的局面。值得注意的是,jpa是在充分吸收了現有hibernate,toplink,jdo等orm架構的基礎上發展而來的,具有易于使用,伸縮性強等優點。從目前的開發社群的反應上看,jpa受到了極大的支援和贊揚,其中就包括了spring與ejb3.0的開發團隊。
注意:jpa是一套規範,不是一套産品,那麼像hibernate,toplink,jdo他們是一套産品,如果說這些産品實作了這個jpa規範,那麼我們就可以叫他們為jpa的實作産品。
spring data jpa 是 spring 基于 orm 架構、jpa 規範的基礎上封裝的一套jpa應用架構,可使開發者用極簡的代碼即可實作對資料的通路和操作。它提供了包括增删改查等在内的常用功能,且易于擴充!學習并使用 spring data jpa 可以極大提高開發效率!
spring data jpa讓我們解脫了dao層的操作,基本上所有crud都可以依賴于它來實作
基本查詢也分為兩種,一種是spring data預設已經實作,一種是根據查詢的方法來自動解析成sql。
spring data jpa 預設預先生成了一些基本的curd的方法,例如:增、删、改等等
1 繼承jparepository
2 使用預設方法
就不解釋了根據方法名就看出意思來
自定義的簡單查詢就是根據方法名來自動生成sql,主要的文法是 findxxby , readaxxby , queryxxby , countxxby , getxxby 後面跟屬性名稱:
也使用一些加一些關鍵字 and 、 or
修改、删除、統計也是類似文法
基本上sql體系中的關鍵詞都可以使用,例如: like 、 ignorecase 、 orderby 。
在實際的開發中我們需要用到分頁、删選、連表等查詢的時候就需要特殊的方法或者自定義sql
分頁查詢在實際使用中非常普遍了,spring data jpa已經幫我們實作了分頁的功能,在查詢的方法中,需要傳入參數 pageable
,當查詢中有多個參數的時候 pageable 建議做為最後一個參數傳入
pageable 是spring封裝的分頁實作類,使用的時候需要傳入頁數、每頁條數和排序規則
有時候我們隻需要查詢前n個元素,或者支取前一個實體。
其實spring data 覺大部分的sql都可以根據方法名定義的方式來實作,但是由于某些原因我們想使用自定義的sql來查詢,spring data也是完美支援的;在sql的查詢方法上面使用 @query 注解,如涉及到删除和修改在需要加上 @modifying .也可以根據需要添加 @transactional 對事物的支援,查詢逾時的設定等
多表查詢在spring data jpa中有兩種實作方式,第一種是利用hibernate的級聯查詢來實作,第二種是建立一個結果集的接口來接收連表查詢後的結果,這裡主要第二種方式。
首先需要定義一個結果集的接口類。
查詢的方法傳回類型設定為新建立的接口
使用
在運作中spring會給接口(hotelsummary)自動生産一個代理類來接收傳回的結果,代碼彙總使用 getxx 的形式來擷取
日常項目中因為使用的分布式開發模式,不同的服務有不同的資料源,常常需要在一個項目中使用多個資料源,是以需要配置sping data jpa對多資料源的使用,一般分一下為三步:
1 配置多資料源
2 不同源的實體類放入不同包路徑
3 聲明不同的包路徑下使用不同的資料源、事務支援
比如我們的項目中,即需要對mysql的支援,也需要對mongodb的查詢等。
實體類聲明 @entity 關系型資料庫支援類型、聲明 @document 為mongodb支援類型,不同的資料源使用不同的實體就可以了
但是,如果user使用者既使用mysql也使用mongodb呢,也可以做混合使用
也可以通過對不同的包路徑進行聲明,比如a包路徑下使用mysql,b包路徑下使用mongodb
使用枚舉的時候,我們希望資料庫中存儲的是枚舉對應的string類型,而不是枚舉的索引值,需要在屬性上面添加 @enumerated(enumtype.string) 注解
正常情況下我們在實體類上加入注解 @entity ,就會讓實體類和表相關連如果其中某個屬性我們不需要和資料庫來關聯隻是在展示的時候做計算,隻需要加上 @transient 屬性既可。
作者:純潔的微笑
<a href="https://z.clouderwork.com/article/32dcfcf9e6658491">原文連結</a>