最近一直在研究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的其它一些功能。
