Java 持久層框架訪問數據庫的方式大體分爲兩種。一種以 SQL 中心,封裝必定程度的 JDBC 操做,好比 MyBatis。另外一種是以 Java Entity 爲中心,將實體的關係對應到數據庫表之間的關係,如 ORM (Object Relational Mapping) 工具。spring
JAP (Java Persistence API) 就是用來整合第三方 ORM 框架的,即創建一套標準的方式。經過註解或 XML 描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中數據庫
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 是一套 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
標註位置:實體類聲明語句以前;
主要做用:標註該Java類爲實體類,且將其映射到指定的數據庫表。
標註位置:實體類聲明語句以前,與@Entity註釋並列使用;
主要做用:標註當前實體類映射到數據庫中的數據表名,當實體類與數據表名不一樣時使用。
標註位置:實體類的屬性聲明語句以前,或屬性的getter()方法以前;
主要做用:指定該實體類的當前屬性映射到數據表的主鍵列。
標註位置:與@Id註釋配合使用;
主要做用:經過其strategy屬性指定數據表主鍵的生成策略。默認狀況下,JPA自動選擇最適合底層數據庫的主鍵生成策略,即SqlServer對應identity,而MySQL對應auto increment。
標註位置:實體類的屬性聲明語句以前,或屬性的getter()方法以前;
主要做用:標註實體類的當前屬性映射到數據庫表的字段名,當屬性名與數據表字段名不一致時使用。
標註位置:實體類的屬性聲明語句以前,或屬性的getter()方法以前;
主要做用:標註實體類的當前屬性不進行數據表字段的映射,ORM框架將忽略此映射,如實體類的getInfo()方法一般不須要映射到數據表的字段上。
標註位置:實體類的屬性聲明語句以前,或屬性的getter()方法以前;
主要做用:標註實體類中Date類型(Java核心API中未定義Date類型的精度)的屬性映射到數據表字段的具體精度(數據庫中Date類型的數據有DATE、TIME和TIMESTAMP三種精度)。
僅僅是一個標識,代表任何繼承它的均爲倉庫接口類,方便Spring自動掃描識別。
繼承Repository,實現了一組CRUD相關的方法。
@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);
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);
}
該接口繼承了CrudRepository接口,提供了兩個方法,實現了分頁和排序的功能了
該接口繼承了PagingAndSortingRepository接口。同時也繼承QueryByExampleExecutor接口,這是個用「實例」進行查詢的接口
@Modifying表示是更新執行
@Transactional帶事務
該接口提供了對JPA Criteria查詢(動態查詢)的支持。
spring data jpa 經過建立方法名來作查詢,只能作簡單的查詢,那若是咱們要作複雜一些的查詢呢,多條件分頁怎麼辦,這裏,spring data jpa爲咱們提供了JpaSpecificationExecutor接口,只要簡單實現toPredicate方法就能夠實現複雜的查詢
1.首先讓咱們的接口繼承於JpaSpecificationExecutor
2.JpaSpecificationExecutor提供瞭如下接口
其中Specification就是須要咱們傳進去的參數,它是一個接口