springboot 系列教程五:springboot data jpa使用詳解

首先了解JPA是什麼?


JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它爲Java開發人員提供了一種對象-關係表關聯映射工具來管理Java應用中的關係數據。他的出現主要是爲了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate,TopLink,JDO等ORM框架各自爲營的局面。值得注意的是,JPA是在充分吸收了現有Hibernate,TopLink,JDO等ORM框架的基礎上發展而來的,具有易於使用,伸縮性強等優點。從目前的開發社區的反應上看,JPA受到了極大的支持和讚揚,其中就包括了Spring與EJB3.0的開發團隊。

注意:JPA是一套規範,不是一套產品,那麼像Hibernate,TopLink,JDO他們是一套產品,如果說這些產品實現了這個JPA規範,那麼我們就可以叫他們爲JPA的實現產品。

Spring Data JPA


Spring Data JPA 是 Spring 基於 ORM 框架、JPA 規範的基礎上封裝的一套JPA應用框架,可使開發者用極簡的代碼即可實現對數據的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易於擴展!學習並使用 Spring Data JPA 可以極大提高開發效率,解脫了DAO層的操作,基本上所有CRUD都可以依賴於它來實現。

基本查詢

基本查詢也分爲兩種,一種是spring data默認已經實現,一種是根據查詢的方法來自動解析成SQL。

預先生成方法

spring data jpa 默認預先生成了一些基本的CURD的方法,例如:增、刪、改等等。

1.繼承JpaRepository

public interface UserDao extends JpaRepository<User, String> {

}

2.使用默認方法

@Test
public void testBaseQuery() throws Exception {
     User user=new User();
     userRepository.findAll();
     userRepository.findOne(1l);
     userRepository.save(user);
     userRepository.delete(user);
     userRepository.count();
     userRepository.exists(1l);
     // ...
}

自定義簡單查詢

自定義的簡單查詢就是根據方法名來自動生成SQL,主要的語法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy後面跟屬性名稱:

User findByUserName(String userName);

也使用一些加一些關鍵字AndOr

User findByUserNameOrEmail(String username, String email);

修改、刪除、統計也是類似語法。

int deleteById(Long id);
int countByUserName(String userName)

基本上SQL體系中的關鍵詞都可以使用,例如:LIKEIgnoreCaseOrderBy

List findByEmailLike(String email);
User findByUserNameIgnoreCase(String userName);
List findByUserNameOrderByEmailDesc(String email);

複雜查詢

在實際的開發中我們需要用到分頁、刪選、連表等查詢的時候就需要特殊的方法或者自定義SQL

分頁查詢

分頁查詢在實際使用中非常普遍了,spring data jpa已經幫我們實現了分頁的功能,在查詢的方法中,需要傳入參數Pageable ,當查詢中有多個參數的時候Pageable建議做爲最後一個參數傳入

Page findALL(Pageable pageable);
Page findByUserName(String userName,Pageable pageable);

Pageable 是spring封裝的分頁實現類,使用的時候需要傳入頁數、每頁條數和排序規則

@Test
public void testPageQuery() throws Exception {
     int page=1,size=10;
     Sort sort = new Sort(Direction.DESC, "id");
     Pageable pageable = new PageRequest(page, size, sort);
     userRepository.findALL(pageable);
     userRepository.findByUserName("testName", pageable);
}

限制查詢

有時候我們只需要查詢前N個元素,或者支取前一個實體

User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
Page queryFirst10ByLastname(String lastname, Pageable pageable);
List findFirst10ByLastname(String lastname, Sort sort);
List findTop10ByLastname(String lastname, Pageable pageable);

自定義SQL查詢

其實 Spring data 覺大部分的SQL都可以根據方法名定義的方式來實現,但是由於某些原因我們想使用自定義的 SQL 來查詢,spring data 也是完美支持的;在 SQL 的查詢方法上面使用@Query註解,如涉及到刪除和修改在需要加上@Modifying。也可以根據需要添加 @Transactional 對事物的支持,查詢超時的設置等。

@Modifying
@Query("update User u set u.userName = ?1 where c.id = ?2")
int modifyByIdAndUserId(String  userName, Long id);

@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteByUserId(Long id);

@Transactional
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章