Spring boot 中Spring data JPA的應用(一)

最近一直在研究Spring Boot,今天爲你們介紹下Spring Data JPA在Spring Boot中的應用,若有錯誤,歡迎你們指正spring

 

先解釋下什麼是JPAsql

JPA就是一個基於O/R映射的標準規範(即實體類和數據庫中的表的一種對映)數據庫

Spring Data JPA是Spring Data 中的一個子項目,除了它還有Spring Data MongoDB等等(恰好最近項目中使用到了,下次能夠作個介紹)app

在Spring Boot中使用Spring Data JPA很是方便,只須要三步,maven

1.在maven中添加spring-boot-stater-data-jpa.以下圖:spring-boot

2.在application.properties屬性文件中定義好Datasuorce,以下圖:spa

3.建立與數據庫中的表對映的實體類和數據訪問層(JpaRepository)code

 

一,定義數據庫訪問層blog

使用Spring Data JPA創建數據庫十分簡單,只須要定義一個繼承了JpaRepository的接口,以下:繼承

public interface PersonRepository extends JpaRepository<Person, Integer> {}

繼承了JpaRepository就至關於有了下面的數據訪問操做方法,

@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAll(Iterable<ID> var1);

    <S extends T> List<S> save(Iterable<S> var1);

    void flush();

    <S extends T> S saveAndFlush(S var1);

    void deleteInBatch(Iterable<T> var1);

    void deleteAllInBatch();

    T getOne(ID var1);
}

 二.JPA的查詢方法

在JPA中有三種方式能夠進行數據的查詢(1,方法命名查詢 2,@NamedQuery查詢 3,@Query查詢),

假設有一張表叫PERSON,字段:ID(INT),NAME(VARCHAR),AGE(INT),ADDRESS(VARCHAR).

實體類:id(integer),name(String),age(integer),address(String)

先來介紹第一種:方法命名查詢

1. Spring Data JPA支持經過定義在Repository接口的方法來定義查詢,方法名字是根據實體類的屬性名來肯定的,示例以下:

public interface PersonRepository extends Repository<Person, Integer> {
       /*
    * 經過地址進行查詢,參數爲address,
    * 至關於JPQL:select p from Person p where p.address=?1
    * */
    List<Person> findByAddress(String address);
       /*
    * 經過地址和名字進行查詢,參數爲name,address
    * 至關於JPQL:select p from Person p where p.name=?1 and address=?2
    * */
    Person findByNameAndAddress(String name,String address);
   
}

   從代碼能夠看出,使用findBy,And這樣的關鍵字,其中的findBy能夠用find,getBy,query,read來進行代替。

   而And就至關於sql語句中的and。

2.用關鍵字限制結果數量,用top和first來實現,示例以下:

/*
*查詢符合條件的前十條記錄
*/
List<Person> findFirst10ByName(String name)
/*
*查詢符合條件的前30條記錄
*/
List<Person> findTop30ByName(String name);

第二種:@NamedQuery查詢

 Spring Data JPA 支持@NameQuery來定義查詢方法,即一個名稱映射一個查詢語句(要在實體類上寫,不是接口裏寫),示例以下:

@Entity
@NamedQuery(name="Person.findByName",
query="select p from Person p where p.name=?1")
public class Person{

}

這樣子就從新定義了findByName這個方法了。

若是要將多個方法都進行從新定義,可使用@NameQueries標籤,示例以下:

@Entity
@NamedQueries({
@NamedQuery(name="Person.findByName",
query="select p from Person p where p.name=?1"),
@NamedQuery(name = "Person.withNameAndAddressNamedQuery",
query = "select p from Person p where p.name=?1 and address=?2")
})
public class Person{

}

這個時候,接口裏定義的findByName方法就是上面的方法了,再也不是方法命名查詢的方法了。

第三種:@Query查詢

 Spring Data JPA 支持@Query來定義查詢方法,使用方法是將@Query寫在接口的方法上面,示例以下:

public interface PersonRepository extends Repository<Person, Integer> {
     @Query("select p from Person p where p.name=?1 and p.address=?2")
    Person withNameAndAddressQuery(String name,String address);
   
}

這裏的參數是根據索引號來進行查詢的。

固然咱們也是能夠根據名稱來進行匹配,而後進行查詢的,示例以下:

public interface PersonRepository extends Repository<Person, Integer> {   
@Query("select p from Person p where p.name= :name and p.address= :address")
Person withNameAndAddressQuery(@Param("name")String name,@Param("address")String address);
}

講完查詢,咱們再來看看更新是如何寫的。

Spring Data JPA支持使用@Modifying和@Query註解組合來進行更新查詢,示例以下:

public interface PersonRepository extends Repository<Person, Integer> {
@Modifying
@Transcational
@Query("update Person p set p.name=?1 ")
int setName(String name);
}

int表示的是更新語句所影響的行數。

下篇正在努力編寫中,再深刻探討下JPA的其它一些功能。

相關文章
相關標籤/搜索