Spring Data JPA 使用

Java 持久層框架訪問數據庫的方式大致分爲兩種。一種以 SQL 中心,封裝一定程度的 JDBC 操作,比如 MyBatis。另一種是以 Java Entity 爲中心,將實體的關係對應到數據庫表之間的關係,如 ORM (Object Relational Mapping) 工具。

JAP (Java Persistence API) 就是用來整合第三方 ORM 框架的,即建立一套標準的方式。通過註解或 XML 描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中

Spring Data JPA 介紹

什麼是 Spring Data JPA

Spring 提供的一個用於簡化 JPA 開發的框架。可以極大的簡化 JPA 的寫法,可以在幾乎不用寫實現的情況下,實現對數據的訪問和操作。除了CRUD外,還包括如分頁、排序等一些常用的功能。

  • Spring Data JPA 是 Spring Data 中的一個子模塊

  • JPA 是一套標準接口,而 Hibernate 是 JPA 的實現,而 Spring Data JPA 底層默認實現是使用Hibernate

  • Spring Data JPA 的首個接口就是 Repository,它是一個標記接口。只要我們的接口實現這個接口,那麼我們就相當於在使用 Spring Data JPA 了。

  • 就是說,只要我們實現了這個接口,我們就可以使用**“按照方法命名規則”**來進行查詢。

JPA、Hibernate 與 Spring Data JPA

JPA 是一套 ORM 規範——即只提供接口,顯然接口不能直接拿來使用。Hibernate實現了 JPA 規範,在 Hibernate 中有自己的獨立 ORM 操作數據庫方式,也有 JPA 規範實現的操作數據庫方式。

雖然 ORM 框架都實現了 JPA 規範,但是在不同 ORM 框架之間切換是需要編寫的代碼有一些差異,而通過使用 Spring Data Jpa 能夠方便大家在不同的 ORM 框架中間進行切換而不要更改代碼。並且 Spring Data Jpa 對 Repository 層封裝的很好,可以省去不少的麻煩。

Spring Data JPA 可以理解爲 JPA 規範的再次封裝抽象,底層還是使用了 Hibernate 的 JPA 技術實現。

JPA 實體相關注解

@Entity

標註位置:實體類聲明語句之前;

主要作用:標註該Java類爲實體類,且將其映射到指定的數據庫表。

@Table

標註位置:實體類聲明語句之前,與@Entity註釋並列使用;

主要作用:標註當前實體類映射到數據庫中的數據表名,當實體類與數據表名不同時使用。

@Id

標註位置:實體類的屬性聲明語句之前,或屬性的getter()方法之前;

主要作用:指定該實體類的當前屬性映射到數據表的主鍵列。

@GeneratedValue

標註位置:與@Id註釋配合使用;

主要作用:通過其strategy屬性指定數據表主鍵的生成策略。默認情況下,JPA自動選擇最適合底層數據庫的主鍵生成策略,即SqlServer對應identity,而MySQL對應auto increment。

img

@Column

標註位置:實體類的屬性聲明語句之前,或屬性的getter()方法之前;

主要作用:標註實體類的當前屬性映射到數據庫表的字段名,當屬性名與數據表字段名不一致時使用。

img

@Transient

標註位置:實體類的屬性聲明語句之前,或屬性的getter()方法之前;

主要作用:標註實體類的當前屬性不進行數據表字段的映射,ORM框架將忽略此映射,如實體類的getInfo()方法通常不需要映射到數據表的字段上。

@Temporal

標註位置:實體類的屬性聲明語句之前,或屬性的getter()方法之前;

主要作用:標註實體類中Date類型(Java核心API中未定義Date類型的精度)的屬性映射到數據表字段的具體精度(數據庫中Date類型的數據有DATE、TIME和TIMESTAMP三種精度)。

基本CRUD操作

Repository接口

僅僅是一個標識,表明任何繼承它的均爲倉庫接口類,方便Spring自動掃描識別。

CRUDRespository接口

繼承Repository,實現了一組CRUD相關的方法。

img

命名參數,索引參數

  • 索引參數如下所示,索引值從1開始,查詢中 ”?X” 個數需要與方法定義的參數個數相一致,並且順序也要一致

@Modifying

@Query(“update User u set u.firstname = ?1 where u.lastname = ?2”)

int setFixedFirstnameFor(String firstname, String lastname);

  • 命名參數(推薦使用這種方式)
    可以定義好參數名,賦值時採用@Param(“參數名”),而不用管順序。如下所示:

public interface UserRepository extends JpaRepository<User, Long> {

@Query(“select u from User u where u.firstname = :firstname or u.lastname = :lastname”)

User findByLastnameOrFirstname(@Param(“lastname”) String lastname,

​ @Param(“firstname”) String firstname);

}

PagingAndSortRespository接口查詢

該接口繼承了CrudRepository接口,提供了兩個方法,實現了分頁和排序的功能了

img

JpaRepository接口

該接口繼承了PagingAndSortingRepository接口。同時也繼承QueryByExampleExecutor接口,這是個用“實例”進行查詢的接口

img

事務在spring data jpa中的使用,@Modifying @Transactional的綜合使用

@Modifying表示是更新執行

@Transactional帶事務

JpaSpecificationExecutor接口

該接口提供了對JPA Criteria查詢(動態查詢)的支持。

spring data jpa 通過創建方法名來做查詢,只能做簡單的查詢,那如果我們要做複雜一些的查詢呢,多條件分頁怎麼辦,這裏,spring data jpa爲我們提供了JpaSpecificationExecutor接口,只要簡單實現toPredicate方法就可以實現複雜的查詢

1.首先讓我們的接口繼承於JpaSpecificationExecutor

2.JpaSpecificationExecutor提供了以下接口

img

其中Specification就是需要我們傳進去的參數,它是一個接口

img

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章