Spring-Date-Jpa
定義了一系列對象持久化的標准 例如Hibernate,TopLink等 spring data jpa讓我們解脫了DAO層的操作,基本上所有CRUD都可以依賴於它來實現
注意:JPA是一套規范,不是一套產品,那么像Hibernate,TopLink,JDO他們是一套產品,如果說這些產品實現了這個JPA規范,那么我們就可以叫他們為JPA的實現產品
(一)預先生成方法
spring data jpa 默認預先生成了一些基本的CURD的方法,例如:增、刪、改等等
1 繼承JpaRepository
2 使用默認方法
(二)自定義簡單查詢
自定義的簡單查詢就是根據方法名來自動生成SQL,主要的語法是findXXBy
,readAXXBy
,queryXXBy
,countXXBy
, getXXBy
后面跟屬性名稱:
也使用一些加一些關鍵字And
、 Or
修改、刪除、統計也是類似語法
基本上SQL體系中的關鍵詞都可以使用,例如:LIKE
、 IgnoreCase
、 OrderBy
。
(三)復雜查詢
分頁查詢
分頁查詢在實際使用中非常普遍了,spring data jpa已經幫我們實現了分頁的功能,在查詢的方法中,需要傳入參數Pageable
,當查詢中有多個參數的時候Pageable
建議做為最后一個參數傳入
Pageable
是spring封裝的分頁實現類,使用的時候需要傳入頁數、每頁條數和排序規則
限制查詢
有時候我們只需要查詢前N個元素,或者支取前一個實體。
自定義SQL查詢
其實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
屬性既可。
源碼案例
這里有一個開源項目幾乎使用了這里介紹的所有標簽和布局,大家可以參考:https://github.com/cloudfavorites/favorites-web
RESTful API設計
請求類型 | 請求路徑 | 功能 |
GET | /girls | 獲取女生列表 |
POST | /girls | 創建一個女生 |
GET | /girls/id | 通過id查詢一個女生 |
PUT | /girls/id | 通過id更新一個女生 |
DELETE | /girls/id | 通過id刪除一個女生 |
@Entity 表示對應數據庫那張表
@Id
@GeneratedValue 表示自增
create //刪除表創建新表
update //更新當前表的內容
create-drop //應用停下來 刪除表
validate //驗證表中數據是否一致
none //什么都不干