1. 程式人生 > >Spring-data-jpa:學習筆記(二)

Spring-data-jpa:學習筆記(二)

       通過上一篇筆記的,我們掌握了SpringData的相關概念及簡單的用法。但上一篇筆記主要講的是Dao層介面直接繼承Repository介面,然後再自己定義方法。主要闡述了自定義方法時的一些規則及SpringData是如何來解析這些方法的。實際上,一些常用的方法SpringData已經幫我們定義好了,我們只需要定義Dao層介面時繼承Repository的有相關功能子介面就ok了。本文主要講的是Repository各個子介面有什麼功能,瞭解了子介面的功能後,後續開發dao層就方便了。         這裡再強調一下使用SpringData開發Dao層的步驟,這個步驟很關鍵。下面這段話是從上一篇筆記中copy過來的

Spring Data JPA 進行持久層(即Dao)開發一般分三個步驟:

  • 宣告持久層的介面,該介面繼承 Repository(或Repository的子介面,其中定義了一些常用的增刪改查,以及分頁相關的方法)。
  • 在介面中宣告需要的業務方法。Spring Data 將根據給定的策略生成實現程式碼。
  • 在 Spring 配置檔案中增加一行宣告,讓 Spring 為宣告的介面建立代理物件。配置了 <jpa:repositories> 後,Spring 初始化容器時將會掃描 base-package 指定的包目錄及其子目錄,為繼承 Repository 或其子介面的介面建立代理物件,並將代理物件註冊為 Spring Bean,業務層便可以通過 Spring 自動封裝的特性來直接使用該物件。

一、Repository子介面相關概述

        先來看下面一張圖,大概能瞭解Repository介面的繼承體系
                  下面闡述下常用的Repository的子介面
  • CrudRepository:繼承Repository介面,新增了一組CRUD相關的方法
  • PagingAndSortingRepository:繼承CrudRepository介面,新增了一組分頁排序的相關方法
  • JpaRepository:繼承PagingAndSortRepository介面,新增了一組JPA規範的方法

        有個不屬於Repository繼承體系的介面,也比較常用,它就是 JpaSpecificationExecutor
  • JpaSpecificationExecutor:不屬於Repository繼承體系,有一組JPA Criteria查詢相關方法

二、CrudRepository介面介紹

        首先我們看下這個介面的程式碼,程式碼如下,它定義好了一組CRUD的方法,共11個。
  1. @NoRepositoryBean
  2. public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
  3. <S extends T> S save(S entity);        //儲存
  4. <S extends T> Iterable<S> save(Iterable<S> entities);//批量儲存
  5. T findOne(ID id);                     //根據id查詢一個物件
  6. boolean exists(ID id);                //判斷物件是否存在
  7. Iterable<T> findAll();                //查詢所有的物件
  8. Iterable<T> findAll(Iterable<ID> ids);//根據id列表查詢所有的物件
  9. long count();                        //計算物件的總個數
  10. void delete(ID id);                  //根據id刪除
  11. void delete(T entity);               //刪除物件
  12. void delete(Iterable<? extends T> entities);//批量刪除
  13. void deleteAll();                    //刪除所有
  14. }
                 下面還是通過一個案例來介紹下這個接口裡面方法的使用,專案的搭建就不介紹了,還是使用上一篇筆記搭建好的專案。
  • 為了和上一篇筆記的程式碼區分開,這裡新建一個實體類User。這個實體類的屬性如下圖
                      
  • Dao層介面定義如下,直接繼承CrudRepository介面即可
                    
  •  測試類程式碼如下,首先我測試了批量儲存方法,向資料庫插入了26條資料。後面又測試了儲存方法,發現這個儲存方法可以起更新的作用的,類似於JPA中EntityManage的merge方法

    
  1. /** 測試CrudRepository的批量save方法 */
  2. @Test
  3. public void testCrudRepositorySaveMethod(){
  4. UserDao dao = ctx.getBean(UserDao.class);
  5. List<User> list = new ArrayList<>();
  6. for (int i = 'A'; i <= 'Z'; i++) {
  7. User u = new User();
  8. u.setName((char)i + "" + (char)i); // AA,BB這種
  9. u.setGender(true);
  10. u.setAge(i + 1);
  11. u.setEmail(u.getName() + "@163.com");
  12. list.add(u);
  13. }
  14. // 呼叫dao的批量儲存
  15. dao.save(list);
  16. }
  17. /** 測試CrudRepository的save */
  18. @Test
  19. public void testCrudRepositoryUpdate(){
  20. UserDao dao = ctx.getBean(UserDao.class);
  21. // 從資料庫查出來
  22. User user = dao.findOne(1);
  23. // 修改名字
  24. user.setName("Aa");
  25. dao.save(user); // 經過測試發現,有id時是更新,但不是絕對的;類似jpa的merge方法
  26. }

三、PagingAndSortingRepository介面介紹

        先通過觀察原始碼可知,這個介面繼承 CrudRepository介面,它新增了一組分頁和排序的方法。原始碼如下

     
  1. @NoRepositoryBean
  2. public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
  3. Iterable<T> findAll(Sort sort);        // 不帶分頁的排序
  4. Page<T> findAll(Pageable pageable);    // 帶分頁的排序
  5. }
                 下面通過一個案例講解這個介面中方法的使用
  • 首先Dao層改一下,把繼承的介面改為PagingAndSortingRepository
                        
  • 單元測試的程式碼如下,這裡只測試了帶分頁和排序的那個方法,不帶分頁的那個方法就不測試了;這裡的重點是引數怎麼傳。而且springdata的分頁時,頁碼是從0開始的,這點要特別注意。

    
  1. /** 測試PagingAndSortingRepositoryd的分頁且排序方法 */
  2. @Test
  3. public void testPagingAndSortingRepository() {
  4. UserDao userDao = ctx.getBean(UserDao.class);
  5. /* 需求:查詢第3頁的資料,每頁5條 */
  6. int page = 3 - 1; //由於springdata預設的page是從0開始,所以減1
  7. 相關推薦

    Spring-data-jpa學習筆記

           通過上一篇筆記的,我們掌握了SpringData的相關概念及簡單的用法。但上一篇筆記主要講的是Dao層介面直接繼承Repository介面,然後再自己定義方法。主要闡述了自定義方法時的一些規則及SpringData是如何

    Spring-data-jpa學習筆記

    一、spring-data-jpa的簡單介紹 SpringData : Spring 的一個子專案。用於簡化資料庫訪問,支援NoSQL 和 關係資料儲存。其主要目標是使資料庫的訪問變得方便快捷。 SpringData 專案所支援 NoSQL 儲存:  MongoD

    Spring MVC 學習筆記@RequestMapping用法詳解

    一、@RequestMapping 簡介 在Spring MVC 中使用 @RequestMapping 來對映請求,也就是通過它來指定控制器可以處理哪些URL請求,相當於Servlet中在web.xml中配置 <servlet>  

    微服務學習筆記Spring Cloud

    2. Spring Cloud Spring Cloud作為Java語言的微服務框架,依賴於Spring Boot,具有快速開發、持續交付、易於部署等特點。 2.1 微服務應該具備的功能 微服務的特點: 按照業務劃分服務。每個微服務執行在獨立的程序中,有獨立的

    Spring-Cloud-Ribbon學習筆記自定義負載均衡規則

    lan cse 重新啟動 ping for obi .config 流行 prope Ribbon自定義負載均衡策略有兩種方式,一是JavaConfig,一是通過配置文件(yml或properties文件)。 需求 假設我有包含A和B服務在內的多個微服務,它們均註冊在一個E

    javascript學習筆記定義函數、調用函數、參數、返回值、局部和全局變量

    兩個 cnblogs bsp 結果 value ava ase com 調用 定義函數、調用函數、參數、返回值 關鍵字function定義函數,格式如下: function 函數名(){ 函數體 } 調用函數、參數、返回值的規則和c語言規則類似。 1 <!DOC

    CSS學習筆記特性

    code 背景色 左移 line tex lin 安裝 其中 cas 一、顏色特性 1. 前景色:color 用種方式指定前景色,3種方式分別是rgb顏色,#16進制編碼,顏色名稱: color: rgb(100,100,100); color: #ee3e80; col

    Unity3D之Mecanim動畫系統學習筆記模型導入

    leg character ... sdk ocs 物體 mat 版本 sset 我們要在Unity3D中使用上模型和動畫,需要經過下面幾個階段的制作,下面以一個人形的模型開發為準來介紹。 模型制作 模型建模(Modelling) 我們的美術在建模時一般會制作一個稱為

    Spring Boot 學習筆記

    imp family framework ima pri spa cal bin ges 新建Srping Boot 項目 以下是項目結構 由於Srping Boot內置Tomcat,所以不需要配置Tomcat就可以直接運行。 HelloWorldAppli

    kubernetes學習筆記bashborad安裝配置

    tag log struct recommend ide col create part describe 官方推薦方法: 連接:https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashb

    Spring框架學習筆記

    約束 存在 基礎 核心 但是 註解 文件的 分享 strong 上接Spring框架學習筆記(一) IOC和DI區別 (1)IOC: 控制反轉,把對象創建交給spring進行配置 (2)DI: 依賴註入,向類裏面的屬性中設置值 (3)關系:依賴註入不能單獨存在,需要在i

    python3學習筆記Python初識

    區別 說明 from 學習筆記 情況 不能 col 需要 學習 一、算法 在開始認真地編程之前,首先來解釋下什麽是計算機程序設計。簡單地說,它就是告訴計算機要做什麽。計算機可以做很多事情,但是它不會自己思考,需要我們告訴它具體細節,並且使用計算機能夠理解的語言把算法告

    Linux學習筆記實戰-根據微服務端口號關閉進程

    java 地方 img linux學習 區分 殺死進程 項目組 cannot home 前言 現在項目組基本都用Springboot,每個服務占用一個端口號,有時需要選擇性的關閉,但在任務管理器上他們的名稱都是java.exe,無法區分,這才學以致用。 killPort.s

    Guava學習筆記基礎Joiner,Objects,Splitter及Strings

    nonnull obj expect null dto 字符 情況 core cte 添加Maven依賴 JoinerTest import com.google.common.base.Joiner; import org.junit.Assert; import org

    opencv 視覺項目學習筆記 基於 svm 和 knn 車牌識別

    its ++ eas -a rect() repr poi obj std 車牌識別的屬於常見的 模式識別 ,其基本流程為下面三個步驟: 1) 分割: 檢測並檢測圖像中感興趣區域; 2)特征提取: 對字符圖像集中的每個部分進行提取; 3)分類: 判斷圖像快是不是車牌或者 每

    安卓開發學習筆記Android Stuidio無法引用Intent來創建對象,出現cannot resolve xxx

    編譯器 port stact 消失 click first 紅色 xxx font 筆者在進行安卓開發時,發現自己的代碼語法完全沒有問題。尤其是創建intent對象的時候,語法完全是正確的,但是Android Stuidio卻顯示報錯,Intent類顯示為紅色,如圖所示:

    Django學習筆記使用Template讓HTML、CSS參與網頁建立

    Django學習筆記(二):使用Template讓HTML、CSS參與網頁建立 通過本文章實現: 瞭解Django中Template的使用 讓HTML、CSS等參與網頁建立 利用靜態檔案應用網頁樣式 一、Template的使用 Template是Django利用渲染器將模板檔案與資料內容結合

    Javaweb學習筆記servlet初體驗、HTTP協議

    目錄 1.Servlet體驗 1.1servlet的繼承體系 1.2手動開發動態web資源 1.3工具開發動態資源 2.HTTP協議 2.1概念 2.2請求資訊 2.2.1請求行 2.2.2請求頭 2.2.3空行與實體內容 2.3HttpServlet

    學習筆記使用K近鄰演算法檢測Web異常操作

    使用全量比較,而不是最頻繁和最不頻繁的比較。 1.資料蒐集        我們使用詞集的模型,將全部命令去重後形成一個大型向量空間,每個命令代表一個特徵,首先通過遍歷全部命令,生成對應詞集。 with open(filename) as f: fo

    Spring Boot 學習筆記—— WEB相關配置

    一、前言 上次我們快速搭建了一個Spring Boot專案,我們只需新增業務邏輯就能直接執行訪問了,說明Spring Boot已經自動為我們做完了配置工作,這次我們就來看看具體是哪些工作,如果我們想接管配置又該怎麼做。 二、WEB相關配置 檢視WebMvcAutoConfigur