MyBatis進階之分頁和延遲加載

在這里插入圖片描述

文章目錄

  • 分頁
    • 1. RowBounds 分頁
    • 2. PageHelper 分頁
    • 3. PageInfo 對象屬性描述
  • 延遲加載
    • 立即加載
    • 激進式延遲加載
    • 真-延遲加載

分頁

Mybatis 中實現分頁功能有 3 種途徑:

  • RowBounds 分頁(不建議使用)
  • Example 分頁(簡單情況可用)
  • PageHelper 分頁(推薦 )

1. RowBounds 分頁

MyBatis 本身通過 RowBounds 對象提供了分頁功能,你僅需為你的 dao 的查詢方法多添加 RowBounds 類型的一個參數,并且不需要對配置文件做任何調整。

RowBounds 也稱原生分頁、邏輯分頁。
RowBounds bounds = new RowBounds(0, 4);
List<Employee> list = dao.select(bounds);

但是這種分頁是一種 邏輯分頁,MyBatis 并未使用 limit 子句,查詢的仍是 所有數據,只是它僅給你「看」到了所有數據中的一部分,邏輯分頁雖然完成了分頁功能,但是它并未通過分頁功能的對性能問題有所提升。

2. PageHelper 分頁

PageHelper 是一款被廣泛使用的 MyBatis 插件。它通過 Mybatis 的插件機制,巧妙地通過機制,在不需要配置文件(不需要寫 limit 子句)的情況下,動態去修改你所執行的 SQL,在其后動態添加 limit 子句。

為了使用 PageHelper 需要引入相應的包:

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.8</version>
</dependency>

PageHelper 是一款 MyBaits 插件,使用它需要向 Mybatis 注冊 PageHelper,并對它作出相關配置(mybatis-config.xml)。

<plugins><!-- com.github.pagehelper 為 PageHelper 類所在包名 --><plugin interceptor="com.github.pagehelper.PageInterceptor"><!-- 使用下面的方式配置參數,后面會有所有的參數介紹 --><property name="helperDialect" value="mysql" /><property name="..." value="..."/></plugin>
</plugins>

警告
pagehelper 有 4.x 和 5.x 兩個版本,用法有所不同,并不是向下兼容,同樣的配置在使用 4.x 或 5.x 版本中可能會報錯。例如,上面的 helperDialect 就是 5.x 中的配置,在 4.x 中使用的是 dialect

如果 Mybatis 整合進了 Spring,除了上述這樣配置外,還可以將相應的注冊-配置工作就在 Spring 的配置文件中進行:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property .../><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><!--使用下面的方式配置參數,一行配置一個 --><value>param1=value1param2=value2...</value></property></bean></array></property>
</bean>

插件的屬性配置

  • helperDialect

    用于指明底層數據庫類型:oracle, mysql, mariadb, sqlite, hsqldb, postgresql, db2, sqlserver, informix, h2, sqlserver2012, derby

  • reasonable

    是否啟用『合理化』功能

    啟用(true)時,如果 pageNum < 1,會返回第一頁內容;如果 pageNum > pages,會返回查詢最后一頁。

    禁用(false)時,超出合理的范圍會直接返回空數據。

在使用 PageHelper 時,PageHelper 提供了 2 種風格來描述分頁:

  • pageNum / pageSize 組合

插件作者建議推薦方式

PageHelper.startPage(1, 10);

這種風格實際上是在模擬「人的語氣」。

  • offset / limit 組合
PageHelper.offsetPage(0, 3);

很顯然,這種風格就是 SQL 語句的分頁寫法

在你調用查詢方法之前,調用 PageHelper 的上述兩個方法中的任意一個,都可激活 PageHelper 插件的分頁功能,使其動態地『幫』你修改SQL語句(添加 limit 子句)。而 Mybatis 的 select 返回的結果就返回的是一頁數據。

PageHelper.startPage(4, 2);
List<Employee> list = empDao.selectByExample(null);
PageInfo<Employee> info = new PageInfo<>(list, 5);System.out.println(info);

注意
由于 PageHelper 插件的實現涉及到 ThreadLocal 原理,這導致一旦 PageHelper 生產了一個分頁參數(一個內部使用的 Page 對象),但是沒有被消費,這個參數就會一直保留在這個線程的 ThreadLocal 中。當這個線程再次被使用時,就可能導致不該分頁的方法去消費這個分頁參數,這就產生了莫名其妙的分頁。所以,分頁參數的創建代碼,和查詢方法的調用代碼,必須「緊密的在一起」。

PageHelper 插件流行的原因在于,它不僅僅能實現分頁功能,而且還進一步封裝了頁面上的『分頁導航條』所需要的所有相關信息。

在使用 PageHelper 的過程中,我們已經提供了 4 個關鍵數據:

PageHelper.startPage(4, 2); // 當前頁的頁號, 每頁顯示的數據量
...
PageInfo<Employee> info = new PageInfo<>(list, 5); // 查詢結果, 導航欄上導航數字的個數

在創建了 PageInfo 之后便可以使用它:

// << < 2 3 [4] 5 6 > >>log.info("是否有下一頁:{}", pageInfo.isHasNextPage());
log.info("是否有上一頁:{}", pageInfo.isHasPreviousPage());
log.info("導航欄上第一個頁號:{}", pageInfo.getNavigateFirstPage());
log.info("導航欄上最后一個頁號:{}", pageInfo.getNavigateLastPage());
log.info("導航欄上的五個導航數字:{}", Arrays.toString(pageInfo.getNavigatepageNums()));
log.info("共有 {} 頁", pageInfo.getPages());
log.info("{} / {} ", pageInfo.getPageNum(), pageInfo.getPages());
log.info("共有 {} 條數據", info.getTotal());

3. PageInfo 對象屬性描述

屬性說明舉例
int pageNum當前頁比如,當前為第 5
int pageSize每頁的數量比如,每頁(計劃/預期)顯示 10 條數據
int size當前頁的數量比如,以 98 條總數據為例,每頁最多顯示 10 條(最后一頁顯示 8 條數據)
int startRow當前頁面第一個元素在數據庫中的行號比如,以 98 條總數據的最后一頁為例,第一條數據是第 91
int endRow當前頁面最后一個元素在數據庫中的行號比如,以 98 條總數據的最后一頁為例,最后一條數據是第 98
int pages總頁數比如,以 98 條總數據為例,每頁顯示 10 條(其中最后一頁 8 條),因此共 10
int prePage前一頁比如,當前是第 5 頁,所以前一頁為 4
int nextPage下一頁比如,當前是第 5 頁,所以下一頁為 6
boolean isFirstPage是否為第一頁比如,當前是第 5 頁,不是第 1 頁,所以為 false
boolean isLastPage是否為最后一頁比如,當前是第 5 頁,不是最后 1 頁,所以為 false
boolean hasPreviousPage是否有前一頁比如,當前是第 5 頁,有前一頁,所以為 true
boolean hasNextPage是否有下一頁比如,當前是第 5 頁,有后一頁,所以為 true
int navigatePages導航頁碼數比如,頁面導航欄顯示 [3 4 5 6 7] 共 5 個數字
int[] navigatepageNums所有導航頁號比如,頁面導航欄顯示 [3 4 5 6 7] 這 5 個數字
int navigateFirstPage導航條上的第一頁比如,頁面導航欄顯示 [3 4 5 6 7] 時,第一頁是第 3
int navigateLastPage導航條上的最后一頁比如,頁面導航欄顯示 [3 4 5 6 7] 時,第一頁是第 7

延遲加載

如果一個對象關聯另一個對象,那么在查詢 A 對象的時候,會去關聯查詢 B 對象。

何時查詢(加載)B 對象分為三種時機:

  • 立即加載
  • 激進式延遲加載
  • 延遲加載

立即加載

MyBaits 默認是立即加載,即在查詢 A 對象的時候,會立即查詢其關聯的 B 對象。如果,B 對象也有關聯對象,例如 C 對象,那么還會立即查詢 C 對象,… 因此類推,直到把所有有關聯關系的數據全部查詢出來。

激進式延遲加載

通過設置,可以啟用延遲加載:

<settings><setting name="lazyLoadingEnabled" value="true"/>
</settings>

啟用延遲加載之后,Mybatis 又是默認的激進地延遲加載。

Mybatis 內部會進行某種規則判斷,從而使得激進式的延遲加載,有時候等同于立即加載,有時候等同于普通的延遲加載。

真-延遲加載

可以再通過配置關閉掉激進地延遲加載,從而進入普通的延遲加載:

<settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/>
</settings>

普通的延遲加載只會在你真正用到 A 對象的 B 屬性時,再去查詢/加載 B 對象。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213250.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于對向量檢索研究的一些學習資料整理

官方學習資料 主要是的學習資料是&#xff0c; 官方文檔 和官方博客。相關文章還是挺多 挺不錯的 他們更新也比較及時。有最新的東西 都會更新出來。es scdn官方博客 這里簡單列一些&#xff0c;還有一些其他的&#xff0c;大家自己感興趣去看。 什么是向量數據庫 Elasticse…

文件加密軟件哪個最好用 好用的文件加密軟件推薦

一說到文件加密軟件&#xff0c;可能大家都會去搜一些不知名的軟件來&#xff0c;但是選擇這種加密軟件&#xff0c;最好還是要看一些資質的。 資質不好的&#xff0c;可能加密過后你自己也打不開文件&#xff0c;&#xff08;ps&#xff1a;我自己就遇到過這種情況&#xff09…

【華為OD機試python】分蘋果【2023 B卷|100分】

【華為OD機試】-真題 !!點這里!! 【華為OD機試】真題考點分類 !!點這里 !! 題目描述 A、B兩個人把蘋果分為兩堆,A希望按照他的計算規則等分蘋果, 他的計算規則是按照二進制加法計算,并且不計算進位 12+5=9(1100 + 0101 = 9), B的計算規則是十進制加法,包括正常進位,…

基于Java SSM框架高校校園點餐訂餐系統項目【項目源碼+論文說明】計算機畢業設計

基于java的SSM框架高校校園點餐訂餐系統演示 摘要 21世紀的今天&#xff0c;隨著社會的不斷發展與進步&#xff0c;人們對于信息科學化的認識&#xff0c;已由低層次向高層次發展&#xff0c;由原來的感性認識向理性認識提高&#xff0c;管理工作的重要性已逐漸被人們所認識&a…

(一)Java 基礎語法

目錄 一. 前言 二. Hello World 三. Java 語法 3.1. 基本語法 3.2. Java 標識符 3.3. Java 修飾符 3.4. Java 變量 3.5. Java 數組 3.6. Java 枚舉 3.7. Java 關鍵字 3.8. Java 注釋 3.9. Java 空行 3.10. Java 繼承 3.11. Java 接口&#xff08;interface&#…

Oracle(2-14)User-Managed Incomplete Recovery

文章目錄 一、基礎知識1、Incomplete Recovery Overview 不完全恢復概述2、Situations Requiring IR 需要不完全恢復的情況3、Types of IR 不完全恢復的類型4、IR Guidelines 不完全恢復指南5、User-Managed Procedures 用戶管理程序6、RECOVER Command Overview 恢復命令概述7…

算法訓練營Day8(字符串)

344.反轉字符串 344. 反轉字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution {public void reverseString(char[] s) {for(int i 0,j s.length-1;i< s.length/2 ; i,j--){swap(s,i,j);}}public void swap(char[] s,int i,int j ){char temp s[i];s[i] s[j]…

Python數據科學視頻講解:Python注釋

2.3 Python注釋 視頻為《Python數據科學應用從入門到精通》張甜 楊維忠 清華大學出版社一書的隨書贈送視頻講解2.3節內容。本書已正式出版上市&#xff0c;當當、京東、淘寶等平臺熱銷中&#xff0c;搜索書名即可。內容涵蓋數據科學應用的全流程&#xff0c;包括數據科學應用和…

20231210原始編譯NanoPC-T4(RK3399)開發板的Android10的SDK

20231210原始編譯NanoPC-T4(RK3399)開發板的Android10的SDK 2023/12/10 17:27 rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ mkdir nanopc-t4 rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ cd nanopc-t4/ …

python4E 之 Dict 找到兩個不同索引但都需要對應的值。

找到兩個不同索引但都需要&#xff0c;對應的值。 df pd.DataFrame(np.random.randint(1, 10, [3,3]), columns list(ABC)) 通過 dict 制造key index_htable{} for _,row in idc.iterrows(): #按行循環 key str(row[u股票代碼]) | str(row[u日期]) #根據不同 的索引…

45.0/HTML 簡介(詳細版)

目錄 45.1 互聯網簡介 45.2 網頁技術與分類 45.3 HTML 簡介 45.3.1 什么是 HTML?(面試題) 45.3.2 HTML 文件結構 45.3.3 HTML 語法 45.3.4 實例演練步驟(面試題) 45.4 head 中的常用標簽 45.4.1 title 標記 45.4.2 meta 標記 45.4.3 45.4.4 45.4.4(面試題)總結: 45…

【AIE】AIE微信合集

AIE微信合集 AIE(1) 對于Versal&#xff0c;我們從系統角度看&#xff0c;可將其分為3個Domain&#xff1a;AIE、PS和PL&#xff0c;如下圖所示。如果要運行一個AIE的應用&#xff0c;絕大多數情況下&#xff0c;這3個Domain我們都會用到&#xff0c;使其協同工作。這里我們僅…

linux less命令(less指令)(查看開頭、從開頭查看、從起始查看、反向導航、反向查找)

文章目錄 Linux Less 命令1. Less 命令簡介2. 基礎用法less filename<command> | less 3. 常用命令行選項4. 高級技巧和用法4.1 搜索內容4.2 標記和跳轉4.3 查看多個文件 5. less命令使用文檔6. 總結 Linux Less 命令 less 是一種在Linux環境中查看文件內容的工具&#…

《絕地求生》新手怎么玩 游戲基本介紹

隨著電競熱潮的興起&#xff0c;《絕地求生》已經成為了一款備受玩家熱愛的游戲。這款游戲在全球范圍內擁有龐大的玩家群體&#xff0c;它將你置身于一個荒無人煙的島嶼上&#xff0c;與其他99名玩家展開生死競爭。作為一個新手&#xff0c;下面閑游盒小盒子就為大家詳細介紹一…

Ubuntu20.04創建并掛在zfs池

Ubuntu 下使用 ZFS [適用于中高級用戶] 主磁盤上清潔安裝帶有ZFS的Ubuntu后&#xff0c;可以開始體驗其特性。 所有ZFS配置過程都需要命令行。 我不知道有GUI工具。 創建一個 ZFS 池 本節僅適用于具有多個磁盤的系統。 如果只有一個磁盤&#xff0c;Ubuntu會在安裝時自動創建…

寫實3D游戲模型紋理貼圖設置

在線工具推薦&#xff1a; 3D數字孿生場景編輯器 - GLTF/GLB材質紋理 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時&#xff0c;有幾種不同的風格&#xff1a; …

Mybatis源碼解析5:Mapper執行流程1

Mybatis源碼解析5&#xff1a;Mapper執行流程1 1.項目結構2. 源碼分析2.1 Mapper代理 MapperProxy#invoke2.2 創建MapperMethod2.2.1 方法名稱解析器ParamNameResolve2.2.2 MapperMethod#execute 2.3 DefaultSqlSession2.4 CachingExecutor2.5 SimpleExecutor#doQuery獲取連接對…

Nacos源碼解讀09——配置中心配置信息創建修改怎么處理的

存儲配置 從整體上Nacos服務端的配置存儲分為三層&#xff1a; 內存&#xff1a;Nacos每個節點都在內存里緩存了配置&#xff0c;但是只包含配置的md5&#xff08;緩存配置文件太多了&#xff09;&#xff0c;所以內存級別的配置只能用于比較配置是否發生了變更&#xff0c;只用…

進行生成簡單數字圖片

1.之前只能做一些圖像預測,我有個大膽的想法,如果神經網絡正向就是預測圖片的類別,如果我只有一個類別那就可以進行生成圖片,專業術語叫做gan對抗網絡 2.訓練代碼 import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transfo…

飛天使-rsync大文件斷點續傳與vim批量刪除

文章目錄 rsync 斷點續傳&#xff0c;親測有效vim 批量刪除消息 rsync 斷點續傳&#xff0c;親測有效 rsync -vzrtp -P --append -e "/usr/bin/ssh -p 22 -o StrictHostKeyCheckingno" m.tar.gz root10.0.0.1:/tmp后臺運行 screem 既可 或者 nohup rsync -vzrt…