Spring Data JPA 使用

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

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

Spring Data JPA 介紹

什麼是 Spring Data JPA

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

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

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

  • Spring Data JPA 的首個接口就是 Repository,它是一個標記接口。只要咱們的接口實現這個接口,那麼咱們就至關於在使用 Spring Data JPA 了。工具

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

JPA、Hibernate 與 Spring Data JPA

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

雖然 ORM 框架都實現了 JPA 規範,可是在不一樣 ORM 框架之間切換是須要編寫的代碼有一些差別,而經過使用 Spring Data Jpa 可以方便你們在不一樣的 ORM 框架中間進行切換而不要更改代碼。而且 Spring Data Jpa 對 Repository 層封裝的很好,能夠省去很多的麻煩。對象

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

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

相關文章
相關標籤/搜索