1. 程式人生 > >Spring Data Jpa系列教程(一)--------入門

Spring Data Jpa系列教程(一)--------入門

大渣好,我是小小書生,現在開始,我們來學習船新的一門技術,SpringDataJpa,它是一個。。額。。(我百度一下)

JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它為Java開發人員提供了一種物件/關聯對映工具來管理Java應用中的關係資料。他的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate,TopLink,JDO等ORM框架各自為營的局面。值得注意的是,JPA是在充分吸收了現有Hibernate,TopLink,JDO等ORM框架的基礎上發展而來的,具有易於使用,伸縮性強等優點。從目前的開發社群的反應上看,JPA受到了極大的支援和讚揚,其中就包括了Spring與EJB3.0的開發團隊。

注意:JPA是一套規範,不是一套產品,那麼像Hibernate,TopLink,JDO他們是一套產品,如果說這些產品實現了這個JPA規範,那麼我們就可以叫他們為JPA的實現產品

Spring Data JPA 是 Spring 基於 ORM 框架、JPA 規範的基礎上封裝的一套JPA應用框架,可使開發者用極簡的程式碼即可實現對資料的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易於擴充套件!學習並使用 Spring Data JPA 可以極大提高開發效率!

spring data jpa讓我們解脫了DAO層的操作,基本上所有CRUD都可以依賴於它來實現

好了,以上就是Spring Data JPA的介紹,現在直接開搞

-------首先在spring data jpa中基本的CRUD其實不用自己去做,你只需要

public interface UserRepository extends JpaRepository<User, Integer>{}

這樣就具備了基礎的CRUD功能,而且不需要寫實現類,spring-data-jpa實現了上面的能力,那他是怎麼實現的呢?這裡我們通過原始碼的方式來呈現他的來龍去脈,這個過程中cglib發揮了傑出的作用。   在spring-data-jpa內部,有一個類,叫做

public class SimpleJpaRepository<T, ID extends Serializable> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T>

我們可以看到這個類是實現了JpaRepository介面的,事實上如果我們按照上面的配置,在同一個包下面有UserRepository,但是沒有UserRepositoryImpl這個類的話,在執行時期UserRepository這個介面的實現就是上面的SimpleJpaRepository這個介面。而如果有UserRepositoryImpl這個檔案的話,那麼UserRepository的實現類就是UserRepositoryImpl,而UserRepositoryImpl這個類又是SimpleJpaRepository的子類,如此一來就很好的解決了上面的這個不用寫implements的問題。我們通過閱讀這個類的原始碼可以發現,裡面包裝了entityManager,底層的呼叫關係是entityManager在進行CRUD。

-------簡單查詢

  Spring Data JPA的獨特之處就是簡單查詢根本不用寫實現類,直接寫介面就好,它能根據你的介面去生成sql,很酷炫吧

按照方法名解析規則如下:

find+全域性修飾+By+實體屬性名稱+限定詞+連線詞+(其他實體屬性)+OrderBy+排序屬性+排序方向

例如:

findDistinctByFirstNameIgnoreCaseAndLastNameOrderByAgeDesc(String firstName,String lastName)

(哇,好長的方法啊!!好神奇)

全域性修飾符:distinct,top,first

關鍵詞(限定詞+連線詞):IsNull,IsNotNull,Like,NotLike,Containing,In,NotIn,IgnoreCase,Between,Equals,

LessThan,GreaterThan,After,Before

排序方向:Asc,Desc

巢狀實體方法命名規則:

例如:

List<Person> findByAddress_ZipCode(ZipCode zipCode)

 構詞法:主實體中的子實體名稱+_+子實體屬性名稱

通過關鍵詞構造方法如下:

// 對應sql:  select * from user where phone like '136%' and address like '%路%'
findByPhoneStartingWithAndAdressContaining(String phone, String address);

所有支援的關鍵詞: