1. 程式人生 > >spring data jap的使用 1

spring data jap的使用 1

最近一直在研究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); }