Spring Data JPA

1、Spring Data 概述

Spring Data提供一整套數據訪問方案,簡化了數據操做層(Dao)的開發,它使用Repository做爲基礎接口。Repository做爲全部數據訪問層的超級接口,具體功能由子接口定義。Repository做爲識別接口,全部繼承此接口的類由spring 自動管理。spring Data 容許咱們之定義接口 ,只要符合Spring Data 規範無需實現。java

public interface Repository<T, ID extends Serializable> {//ID 類型必須繼承序列化,也就是基本類型須要使用包裝類型
}

2、repository 結構

數據訪問層相似Dao,這裏既爲repositoryspring

Spring Data 提供了幾個Repository,基礎的Repository提供了基本的訪問功能,其子接口進行擴展,繼承功能以下:spa

repository:提供基本的訪問功能code

CrudRepository:繼承repository增長數據增刪改等功能blog

PagingAndSortingRepository:繼承CrudRepository並實現排序和分頁功能排序

JpaRepository:繼承PagingAndSortingRepository並實現一組jpa規範功能繼承

JpaSpecificationExecutor:不屬於Repository實現一組JPA criteria相關方法索引

咱們本身定義的XxxxRepository須要繼承JpaRepository,這樣咱們的XxxxRepository接口就具有了通用的數據訪問控制層的能力。接口

3、Spring Data 查詢

1.簡單的查詢

按照Spring data 定義的規則,查詢方法以find|read|get開頭 
涉及條件查詢時,條件的屬性用條件關鍵字鏈接,要注意的是:條件屬性以首字母大寫其他字母小寫爲規定。 
例如:定義一個Entity實體類 
ci

class User{ 
private String firstname; 
private String lastname; 
}

使用And條件鏈接時,應這樣寫: 

findByLastnameAndFirstname(String lastname,String firstname);

條件的屬性名稱與個數要與參數的位置與個數一一對應 

2.使用JPA NamedQueries(標準規範實現)

這種查詢是標準的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); 
}

3.使用@Query自定義查詢(Spring Data提供)

這種查詢能夠聲明在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);

5.索引參數和命名參數

(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 

相關文章
相關標籤/搜索