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


最近一直在研究Spring Boot,今天為大家介紹下Spring Data JPA在Spring Boot中的應用,如有錯誤,歡迎大家指正

 

先解釋下什么是JPA

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

Spring Data JPA是Spring Data 中的一個子項目,除了它還有Spring Data MongoDB等等(剛好最近項目中使用到了,下次可以做個介紹)

在Spring Boot中使用Spring Data JPA非常方便,只需要三步,

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

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

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

 

一,定義數據庫訪問層

使用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的其它一些功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM