Spring Data提供一整套數據訪問方案,簡化了數據操做層(Dao)的開發,它使用Repository做爲基礎接口。Repository做爲全部數據訪問層的超級接口,具體功能由子接口定義。Repository做爲識別接口,全部繼承此接口的類由spring 自動管理。spring Data 容許咱們之定義接口 ,只要符合Spring Data 規範無需實現。java
public interface Repository<T, ID extends Serializable> {//ID 類型必須繼承序列化,也就是基本類型須要使用包裝類型 }
數據訪問層相似Dao,這裏既爲repositoryspring
Spring Data 提供了幾個Repository,基礎的Repository提供了基本的訪問功能,其子接口進行擴展,繼承功能以下:spa
repository:提供基本的訪問功能code
CrudRepository:繼承repository增長數據增刪改等功能blog
PagingAndSortingRepository:繼承CrudRepository並實現排序和分頁功能排序
JpaRepository:繼承PagingAndSortingRepository並實現一組jpa規範功能繼承
JpaSpecificationExecutor:不屬於Repository實現一組JPA criteria相關方法索引
咱們本身定義的XxxxRepository須要繼承JpaRepository,這樣咱們的XxxxRepository接口就具有了通用的數據訪問控制層的能力。接口
按照Spring data 定義的規則,查詢方法以find|read|get開頭
涉及條件查詢時,條件的屬性用條件關鍵字鏈接,要注意的是:條件屬性以首字母大寫其他字母小寫爲規定。
例如:定義一個Entity實體類
ci
class User{ private String firstname; private String lastname; }
使用And條件鏈接時,應這樣寫:
findByLastnameAndFirstname(String lastname,String firstname);
條件的屬性名稱與個數要與參數的位置與個數一一對應
這種查詢是標準的JPA規範所定義的,直接聲明在Entity實體類上,調用時採用在接口中定義與命名查詢對應的method,由Spring Data根據方法名自動完成命名查詢的尋找。
(1)在Entity實體類上使用@NamedQuery註解直接聲明命名查詢。
@Entity @NamedQuery(name = "User.findByEmailAddress", query = "select u from User u where u.emailAddress = ?1") public class User { }
注:定義多個時使用下面的註解
@NamedQueries(value = { @NamedQuery(name = User.QUERY_FIND_BY_LOGIN, query = "select u from User u where u." + User.PROP_LOGIN + " = :username"), @NamedQuery(name = "getUsernamePasswordToken", query = "select new com.aceona.weibo.vo.TokenBO(u.username,u.password) from User u where u." + User.PROP_LOGIN + " = :username")})
(2)在interface中定義與(1)對應的方法
public interface UserRepository extends JpaRepository<User, Long> { List<User> findByLastname(String lastname); User findByEmailAddress(String emailAddress); }
這種查詢能夠聲明在Repository方法中,擺脫像命名查詢那樣的約束,將查詢直接在相應的接口方法中聲明,結構更爲清晰,這是Spring data的特有實現。
例如:
public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where u.emailAddress = ?1") User findByEmailAddress(String emailAddress); }
4.@Query與@Modifying執行更新操做
這兩個annotation一塊兒聲明,可定義個性化更新操做,例如只涉及某些字段更新時最爲經常使用,示例以下:
@Modifying @Query("update User u set u.firstname = ?1 where u.lastname = ?2") int setFixedFirstnameFor(String firstname, String lastname);
(1)索引參數以下所示,索引值從1開始,查詢中 」?X」 個數須要與方法定義的參數個數相一致,而且順序也要一致
@Modifying @Query("update User u set u.firstname = ?1 where u.lastname = ?2") int setFixedFirstnameFor(String firstname, String lastname);
(2)命名參數(推薦使用這種方式)
能夠定義好參數名,賦值時採用@Param("參數名"),而不用管順序。以下所示:
public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname") User findByLastnameOrFirstname(@Param("lastname") String lastname, @Param("firstname") String firstname); }
定義XxxxRepository 接口並繼承JpaRepository接口,若是Spring data所提供的默認接口方法不夠用,可使用@Query在其中定義個性化的接口方法。
http://jishiweili.iteye.com/blog/2088265