天天看點

Spring Data JPA快速入門

一、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架構

Spring Data JPA快速入門

https://spring.io/projects/spring-data-jpa#overview

Spring Data Jpa官方解釋

Spring Data JPA快速入門

Spring Data JPA是Spring Data家族的一部分,可以輕松實作基于JPA的存儲庫。 此子產品處理對基于JPA的資料通路層的增強支援。 它使建構使用資料通路技術的Spring驅動應用程式變得更加容易。

在相當長的一段時間内,實作應用程式的資料通路層一直很麻煩。 必須編寫太多樣闆代碼來執行簡單查詢以及執行分頁和審計。 Spring Data JPA旨在通過減少實際需要的工作量來顯著改善資料通路層的實作。 作為開發人員,您編寫repository接口,包括自定義查找器方法,Spring将自動提供實作。

Spring Data生态

Spring Data JPA快速入門

JPA是ORM規範,Hibernate、TopLink等是JPA規範的具體實作,這樣的好處是開發者可以面向JPA規範進行持久層的開發,而底層的實作則是可以切換的。Spring Data Jpa則是在JPA之上添加另一層抽象(Repository層的實作),極大地簡化持久層開發及ORM架構切換的成本。

Jpa、Hibernate、Spring Data Jpa三者之間的關系

Spring Data JPA快速入門

項目結構

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