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