一、Spring Data Jpa 簡介
1.JPA
2.Spring Data Jpa
3.Jpa、Hibernate、Spring Data Jpa三者之間的關系
二、入門案例
1.增删改查
2.标準查詢
JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0後提出的Java持久化規範(JSR 338,這些接口所在包為javax.persistence,詳細内容可參考:https://github.com/javaee/jpa-spec)
JPA的出現主要是為了簡化持久層開發以及整合ORM技術,結束Hibernate、TopLink、JDO等ORM架構各自為營的局面。JPA是在吸收現有ORM架構的基礎上發展而來,易于使用,伸縮性強。總的來說,JPA包括以下3方面的技術:
ORM映射中繼資料: 支援XML和注解兩種中繼資料的形式,中繼資料描述對象和表之間的映射關系
API: 操作實體對象來執行CRUD操作
查詢語言: 通過面向對象而非面向資料庫的查詢語言(JPQL)查詢資料,避免程式的SQL語句緊密耦合
JPA架構

https://spring.io/projects/spring-data-jpa#overview
Spring Data Jpa官方解釋
Spring Data JPA是Spring Data家族的一部分,可以輕松實作基于JPA的存儲庫。 此子產品處理對基于JPA的資料通路層的增強支援。 它使建構使用資料通路技術的Spring驅動應用程式變得更加容易。
在相當長的一段時間内,實作應用程式的資料通路層一直很麻煩。 必須編寫太多樣闆代碼來執行簡單查詢以及執行分頁和審計。 Spring Data JPA旨在通過減少實際需要的工作量來顯著改善資料通路層的實作。 作為開發人員,您編寫repository接口,包括自定義查找器方法,Spring将自動提供實作。
Spring Data生态
JPA是ORM規範,Hibernate、TopLink等是JPA規範的具體實作,這樣的好處是開發者可以面向JPA規範進行持久層的開發,而底層的實作則是可以切換的。Spring Data Jpa則是在JPA之上添加另一層抽象(Repository層的實作),極大地簡化持久層開發及ORM架構切換的成本。
Jpa、Hibernate、Spring Data Jpa三者之間的關系
項目結構
build.gradle
user.sql
配置spring相關
資料源資訊
jpa的實作方式
配置要用到的實體類
配置jpa實作方的配置資訊
配置事務管理器
聲明式事務
spring_data_jpa.xml
User.java
@Query
value:資料庫操作語句
nativeQuery:是否是原生查詢,預設false,即預設使用jpql查詢
@Modifying:聲明目前是一個更新操作,需要修改資料庫資料。
隻能用于void或int/Integer的傳回類型
因為需要修改資料庫資料,未防止修改失敗造成未知後果,需要搭配事務管理來是使用
@Transactional:添加事務管理支援
一般需要設定rollbackFor或者noRollbackFor,來表示什麼情況下進行事務復原
@Rollback:是否可以復原,預設true
方法命名規則查詢
spring data jpa制定了一些約定,如果按照這些約定來定義方法名,則會自動解析出sql語句。
findBy + 屬性名 + 查詢方式 + (And|Or) + 屬性名 + 查詢方式…
查詢方式
方法命名
sql where字句
And
findByNameAndPwd
where name= ? and pwd =?
Or
findByNameOrSex
where name= ? or sex=?
Is,Equals
findById,findByIdEquals
where id= ?
Between
findByIdBetween
where id between ? and ?
LessThan
findByIdLessThan
where id < ?
LessThanEquals
findByIdLessThanEquals
where id <= ?
GreaterThan
findByIdGreaterThan
where id > ?
GreaterThanEquals
findByIdGreaterThanEquals
where id > = ?
After
findByIdAfter
Before
findByIdBefore
IsNull
findByNameIsNull
where name is null
isNotNull,NotNull
findByNameNotNull
where name is not null
Like
findByNameLike
where name like ?
NotLike
findByNameNotLike
where name not like ?
StartingWith
findByNameStartingWith
where name like ‘?%’
EndingWith
findByNameEndingWith
where name like ‘%?’
Containing
findByNameContaining
where name like ‘%?%’
OrderBy
findByIdOrderByXDesc
where id=? order by x desc
Not
findByNameNot
where name <> ?
In
findByIdIn(Collection<?> c)
where id in (?)
NotIn
findByIdNotIn(Collection<?> c)
where id not in (?)
True
findByAaaTue
where aaa = true
False
findByAaaFalse
where aaa = false
IgnoreCase
findByNameIgnoreCase
where UPPER(name)=UPPER(?)
UserDao.java
CURDTest.java
這裡是JpaSpecificationExecuto的源碼,為了便于閱讀,我删除了注釋,有的方法已經在上面的代碼中示範過。可以看到,這5個方法有個共同點,接收一個Specification參數。
Specification是對JPA規範中Root、CriteriaQuery、CriteriaBuilder的一層封裝,用于建構過濾條件。執行個體化Specification需要實作它的toPerdicate方法
這裡介紹一個例子,查詢表中年齡大于18的湖北人
SpecificationTest.java