前段時間項目使用Spring Data JPA,本人初次涉獵對於新的技術老是熱情滿滿,後面使用了一段時間總之有利有弊吧。如今把對於Spring Data JPA的使用心得寫下來,歡迎同道人士指正交流。html
Spring Data JPA是由Spring提供的一個用於簡化JPA開發的框架,能夠極大的簡化JPA的寫法,能夠在幾乎不用寫實現的狀況下,實現對數據的訪問和操做。除了CRUD外,還包括如分頁、排序等一些經常使用的功能。下面開始說如何使用 Spring Data JPA。java
1、pom.xml引入jar包
spring
其餘相關的包我就不說了,上面的連接裏也有,通常標準的springMVC項目都應該有那些包。sql
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.8.0.RELEASE</version> </dependency>
2、dao繼承相應的接口數據庫
Spring Data JPA提供的接口,也是Spring Data JPA的核心概念:框架
1:Repository:最頂層的接口,是一個空的接口,目的是爲了統一全部Repository的類型,且能讓組件掃描的時候自動識別。工具
2:CrudRepository :是Repository的子接口,提供CRUD的功能spa
3:PagingAndSortingRepository:是CrudRepository的子接口,添加分頁和排序的功能翻譯
4:JpaRepository:是PagingAndSortingRepository的子接口,增長了一些實用的功能,好比:批量操做等。code
5:JpaSpecificationExecutor:用來作負責查詢的接口
6:Specification:是Spring Data JPA提供的一個查詢規範,要作複雜的查詢,只需圍繞這個規範來設置查詢條件便可
上面幾種接口的說明,每一個接口封裝的方法不同,這裏咱們繼承其中兩個JpaRepository、JpaSpecificationExecutor
//JpaRepository<Account, String>中的Account爲規定該持久層能操做的持久對象,String爲主鍵類型 public interface AccountRepository extends JpaRepository<Account, String>,JpaSpecificationExecutor<Account> { public Account findByName(String name); public List<Acount> findByArea(String area); @Query("from Account where xxx = ?1") public Account findByXXX(String xxx); }
3、service注入相應repository
也許你們注意到了我沒有說關於repository的實現,這個我後面會說明,這就是DataJpa的魅力。
@Service @Transactional public Class AccountServiceImpl implements AccountService{ @Autowired private AccountRepository accountRepository; public void repositoryTest(){ //---------列舉repository集成相關類後部分自帶方法,更多自行查看文檔------------------ //經過ID查找account Account account = accountRepository.findOne(id); //保存或更新 account //該方法會自動根據account對象裏是否包含有id且數據庫是否存在該id的對象去採起新增仍是更新操做 accountRepository.save(account); //刪除指定account //除了ID也可直接傳入實體 更多方式自行查看文檔 accountRepository.delete(id); //批量刪除 更多方式自行查看文檔 accountRepository.deleteInBatch(account的集合) //查詢全部account accountRepository.findAll(); //---------調用自定義的方法--------- Account account = accountRepository.findByName(name); List<Acount> list = findByArea(rea); Account account = findByXXX(xxx); } }
經過上面的代碼能夠看出經過repository繼承JpaRepository、JpaSpecificationExecutor後咱們能夠很方便的進行CRUD操做。但findByName這種又是怎麼實現查詢的呢?
1.<Query creation from method names>
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Like | findByFirstnameLike | … where x.firstname like ?1 |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
以上我只列舉了部分,具體查看官方文檔:
http://docs.spring.io/springdata/jpa/docs/1.8.0.RELEASE/reference/html/#jpa.repositories
因而可知只要以findBy開頭+對象的字段(首字母大寫)+條件規則 的方法名 data jpa就會自動解析成響應的ql語句進行查詢。
2.使用@Query註解
@Query是相比規範式方法名的作法更加靈活或且方便不知道規範式命名的人員更加方便的使用data jpa
public interface UserRepository extends JpaRepository<User, Long> { //jpql語句格式 @Query("select u from User u where u.firstname like %?1") List<User> findByFirstnameEndsWith(String firstname); //nativeQuery 可讓你使用sql語句來查詢 @Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?0", nativeQuery = true) User findByEmailAddress(String emailAddress); //@Param能夠指定一個名稱與query註解中的某個佔位名稱相對應 @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname") User findByLastnameOrFirstname(@Param("lastname") String lastname, @Param("firstname") String firstname); }
3.修改查詢Modifying queries
@Modifying @Query("update User u set u.firstname = ?1 where u.lastname = ?2") int setFixedFirstnameFor(String firstname, String lastname);
以上就是對於Spring Data JPA的簡單應用,它還有不少功能可使用SpEL表達式、能夠調用存儲過程查詢、以及後面我單獨寫一篇關於複雜多表以及分頁要用到的Specifications查詢等等,有興趣的同志們能夠多看看官方文檔,本人英語老差了,都是一點點用工具翻譯結合其餘大神的帖子看的,那麼累啊!