Spring Data JPA

一、概念

JPA(Java Persistence API)是Sun官方提出的Java持久化規范。為Java開發人員提供了一種對象/關系映射工具來管理Java應用中的關系數據。

Spring Data JPA是spring基于ORM框架、JPA規范的基礎上封裝的一套JPA應用框架,底層使用了Hibernate的JPA技術實現,可使開發者用極簡的代碼即可實現對數據的訪問和操作。提供了包括增刪改查等在內的常用功能,且易于擴展。

Spring Data JAP讓我們解脫了DAO層的工作,基本上所有的CRUD都可以依賴于它來實現。

JAR包:spring-Boot-starter-data-jpa.jar

二、Repository

1.建立entity相關的注解:

@Entity:用于實體類上。

@Table:指定Entity所要映射的數據庫表,如果缺省,系統默認采用類名作為映射表的表名。

@Id:聲明此屬性為主鍵。

@GeneratedValue(strategy=GenerationType, generator=""):

strategy表示主鍵生成策略,有AUTO, INDENTITY, SEQUENCE和TABLE四種,分別表示讓ORM框架自動選擇,根據數據庫的Identity字段生成,根據數據庫表的Sequence字段生成,根據一個額外的表生成主鍵,默認為AUTO。

generator表示主鍵生成器的名稱,這個屬性通常和ORM框架有關,例如,hibernate可以指定uuid等主鍵生成方式。

例:

1)SEQUENCE

@Id@GeneratedValue(strategy=GenarationType.SEQUENCE, genetator="aaa")@SequenceGenerator(name="aaa", sequenceName="seq_xxx")

2)IDENTIFY

@Id@GeneratedValue(strategy=GenarationType.IDENTIFY)

3)AUTO

@Id@GeneratedValue(strategy=GenarationType.AUTO)

@Column(nullable=false, unique=true……)

1.1JPA主鍵@Id、@IdClass、@Embeddable、@EmbeddedId

1)自動主鍵

@Id @GeneratedValue一起使用(以上介紹)。

2)應用設置主鍵

如果一個實體有一個沒有@GeneratedValue標記的主鍵字段,則不會生成自動主鍵值,并且應用程序負責通過初始化主鍵字段來設置主鍵。這必須在持久化實體對象之前完成。

3)復合主鍵

由多個主鍵字段組成。當一個實體有多個主鍵字段時,JPA需要定義一個特殊的ID類,該類是使用@IdClass注釋附加到實體類的。如果實體對象必須按照檢索實體部分中所示的主鍵來檢索實體對象,那么就需要ID類。

例:

實體類:

@Entity @IdClass(ProjectId.class)

public class Project{

@Id int departmentId;

@Id long projectId;}

ID類:

class ProjectId{

int departmentId;

long projectId;}

4)嵌入式主鍵

復合主鍵的另一種方式是使用嵌入式的類。主鍵字段是在可嵌入類中定義的。該實體包含一個單獨的主鍵字段,該字段用@EmbeddedId注釋,并包含一個可嵌入類的實例。當使用這個表單時,沒有定義一個單獨的ID類,因為可嵌入的類本身可以表示完整的主鍵值。

例:

實體類:

public class Project{

@EmbeddedId ProjectId id;

}

主鍵類:

@Embeddable

class ProjectId{

int departmentId;

long projectId;}

注意,復合主鍵類必須滿足:實現Serializable接口;有默認的public無參數構造方法;重寫equals和hashCode方法。

2.聲明repository接口,可繼承JpaRepository, PagingAndSortingRepository, CrudRepository

實際上,JpaRepository實現了PagingAndSortingRepository接口,PagingAndSortingRepository接口實現了CrudRepository接口,CrudRepository接口實現了Repository接口。

Repository接口是一個標識接口,里面是空的;

CrudRepository接口定義了增刪改查方法;

PagingAndSortingRepository接口用于分頁和排序;

由于JpaRepository接口繼承了以上所有接口,所以擁有它們聲明的所有方法。

3.直接聲明接口不需要具體實現就能完成數據庫的操作,其實現原理:

聲明的repository接口被注入了一個動態代理,被代理的類是JpaRepository的一個實現SimpleJpaRepository。

Spring會在啟動的時候掃描所有繼承自Repository接口相關的DAO接口,然后為其實例化一個動態代理,同時根據它的方法名、參數等為其裝配一系列DB操作組件,在需要注入的時候為對應的接口注入這個動態代理,在DAO方法被調用的時候會走這個動態代理,然后經過一系列的方法攔截路由到最終的DB操作執行器JpaQuertExecution,然后拼裝SQL,執行相關操作,返回結果。

4.應用

1)基本查詢

分為兩種,一種是Spring Data默認已經實現(只繼承JpaRepository),一種是根據查詢的方法來自動解析成SQL。

2)復雜查詢

在實際的開發中我們需要用到分頁、刪選、連表等查詢的時候就需要特殊的方法或者自定義SQL。

分頁查詢:需要傳入參數Pageable,返回Page對象。Pageable是Spring封裝的分頁實現類,使用的時候需要傳入頁數、每頁條數和排序規則。

自定義SQL查詢:在SQL的查詢方法上面使用@Query注解,如果涉及到刪除和修改,可以加上@Modifying。也可以根據需要添加@Transactional對事務的支持,查詢超時的設置等。

多表查詢:有兩種實現方式,第一種是利用hibernate的級連查詢來實現,第二種是創建一個結果集的接口來接收連表查詢后的結果。

5. Spring Data JPA常用注解:

@Transient注解:

表示該屬性并非一個到數據庫表的字段的映射,ORM框架將忽略此屬性。

@NamedQuery注解:

用于實體類上,定義多個時使用@NamedQueries。如@NamedQuery(name="User.findByName", Query="select * from User where name=?1")。在自己實現的DAO的Repository 接口里面定義一個同名的方法,然后在使用中,Spring會找找是否有同名的NamedQuery,如果有,那么久不會按照接口定義的方法來解析。

@Query注解:

用于接口中自定義的查詢方法上,可以使用JPQL,也可使用本地查詢(nativeQuery=true)。所謂本地查詢,就是使用原生SQL語句。

注意:方法的參數個數必須和@Query里需要的參數個數一致;

JPQL占位符"?"后的數字代表的是方法參數里的順序;

如果是like查詢,需要在參數的前面或后面加"%";

同樣支持更新類的Query語句,添加@Modifying即可。在調用的地方必須加事務,沒有事務不能正常執行???

使用@Param注解注入JPQL或者SQL的參數;可以利用SpEL表達式把實體類寫成動態的#{#entityName}:是實體類的名稱。實體類Book,使用@Entity注解后,Spring會將實體類Book納入管理。默認#{#entityName}的值就是"Book"。但是如果使用了@Entity(name="book")來注解實體類Book,此時#{#entityName}的值就變成了"book"。因此,可以用@Entity注解實體類時指定name為比實體類對應的表名,在原生SQL語句中,就可以把#{#entityName}作為數據表名使用。

@Modifying注解:

1)可以通過自定義的JPQL完成UPDATE和DELETE操作。注意:JPQL不支持使用INSERT。

2)在@Query注解中編寫JPQL語句,但必須使用@Modifying進行修飾,以通知Spring Data這是一個UPDATE或DELETE操作。

3)UPDATE或DELETE操作需要使用事務,此時需要定義Service層,在Service層的方法上添加事務操作。

4)默認情況下,Spring Data的每個方法上有事務,但都是一個只讀事務,它們不能完成修改操作。

@EnableJpaRepositories注解:

6.查詢策略

create-if-not-found(默認):如果通過@Query指定查詢語句,則執行該語句,如果沒有,則看看有沒有@NamedQuery指定的查詢語句,如果還沒有,則通過解析方法名進行查詢。

查詢策略有三種,可更改。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容