Spring-data-jpa:學習筆記(二)
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個。@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S entity); //儲存
<S extends T> Iterable<S> save(Iterable<S> entities);//批量儲存
T findOne(ID id); //根據id查詢一個物件
boolean exists(ID id); //判斷物件是否存在
Iterable<T> findAll(); //查詢所有的物件
Iterable<T> findAll(Iterable<ID> ids);//根據id列表查詢所有的物件
long count(); //計算物件的總個數
void delete(ID id); //根據id刪除
void delete(T entity); //刪除物件
void delete(Iterable<? extends T> entities);//批量刪除
void deleteAll(); //刪除所有
}
- 為了和上一篇筆記的程式碼區分開,這裡新建一個實體類User。這個實體類的屬性如下圖
- Dao層介面定義如下,直接繼承CrudRepository介面即可
- 測試類程式碼如下,首先我測試了批量儲存方法,向資料庫插入了26條資料。後面又測試了儲存方法,發現這個儲存方法可以起更新的作用的,類似於JPA中EntityManage的merge方法
/** 測試CrudRepository的批量save方法 */
@Test
public void testCrudRepositorySaveMethod(){
UserDao dao = ctx.getBean(UserDao.class);
List<User> list = new ArrayList<>();
for (int i = 'A'; i <= 'Z'; i++) {
User u = new User();
u.setName((char)i + "" + (char)i); // AA,BB這種
u.setGender(true);
u.setAge(i + 1);
u.setEmail(u.getName() + "@163.com");
list.add(u);
}
// 呼叫dao的批量儲存
dao.save(list);
}
/** 測試CrudRepository的save */
@Test
public void testCrudRepositoryUpdate(){
UserDao dao = ctx.getBean(UserDao.class);
// 從資料庫查出來
User user = dao.findOne(1);
// 修改名字
user.setName("Aa");
dao.save(user); // 經過測試發現,有id時是更新,但不是絕對的;類似jpa的merge方法
}
三、PagingAndSortingRepository介面介紹
先通過觀察原始碼可知,這個介面繼承 CrudRepository介面,它新增了一組分頁和排序的方法。原始碼如下@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort); // 不帶分頁的排序
Page<T> findAll(Pageable pageable); // 帶分頁的排序
}
- 首先Dao層改一下,把繼承的介面改為PagingAndSortingRepository
- 單元測試的程式碼如下,這裡只測試了帶分頁和排序的那個方法,不帶分頁的那個方法就不測試了;這裡的重點是引數怎麼傳。而且springdata的分頁時,頁碼是從0開始的,這點要特別注意。
/** 測試PagingAndSortingRepositoryd的分頁且排序方法 */
@Test
public void testPagingAndSortingRepository() {
UserDao userDao = ctx.getBean(UserDao.class);
/* 需求:查詢第3頁的資料,每頁5條 */
int page = 3 - 1; //由於springdata預設的page是從0開始,所以減1
相關推薦
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