Mybatis的分頁(yè)實(shí)現(xiàn)方式
MyBatis 的分頁(yè)實(shí)現(xiàn)方式主要有以下幾種,每種方式適用于不同的場(chǎng)景,且在性能、靈活性和代碼侵入性上有所差異:
?1. 原生 SQL 分頁(yè)(物理分頁(yè))?
原理:直接在 SQL 中編寫(xiě)數(shù)據(jù)庫(kù)特定的分頁(yè)語(yǔ)法(如 MySQL 的 LIMIT
、Oracle 的 ROWNUM
)。
示例:
<select id="selectUsers" resultType="User"> SELECT * FROM users LIMIT #{offset}, #{pageSize} </select>
優(yōu)點(diǎn):
- 性能最優(yōu),直接通過(guò)數(shù)據(jù)庫(kù)物理分頁(yè),僅查詢所需數(shù)據(jù)。
- 無(wú)額外依賴,適用于簡(jiǎn)單場(chǎng)景。
缺點(diǎn):
- SQL 與數(shù)據(jù)庫(kù)類型綁定,切換數(shù)據(jù)庫(kù)需修改 SQL。
- 需要手動(dòng)計(jì)算分頁(yè)參數(shù)(offset、pageSize)。
?2. RowBounds 分頁(yè)(邏輯分頁(yè))?
原理:通過(guò) MyBatis 的 RowBounds
對(duì)象實(shí)現(xiàn)內(nèi)存分頁(yè)(邏輯分頁(yè))。查詢時(shí)會(huì)獲取全部數(shù)據(jù),但在內(nèi)存中截取指定范圍。
示例:
List<User> users = sqlSession.selectList("selectUsers", null, new RowBounds(offset, pageSize));
優(yōu)點(diǎn):
- 代碼簡(jiǎn)單,無(wú)需修改 SQL。
- 兼容所有數(shù)據(jù)庫(kù)。
缺點(diǎn):
- ?性能差:數(shù)據(jù)量大時(shí)會(huì)導(dǎo)致內(nèi)存溢出或查詢緩慢(需全量加載數(shù)據(jù))。
- 僅適用于小數(shù)據(jù)集。
?3. PageHelper 插件(推薦)?
原理:通過(guò)攔截器動(dòng)態(tài)修改 SQL,自動(dòng)添加分頁(yè)語(yǔ)句(物理分頁(yè))。支持多種數(shù)據(jù)庫(kù),并封裝分頁(yè)結(jié)果(總條數(shù)、頁(yè)碼等)。
使用步驟:
?引入依賴:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.0</version> </dependency>
?配置攔截器?(MyBatis 配置文件中):
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> <!-- 指定數(shù)據(jù)庫(kù)類型 --> </plugin> </plugins>
?代碼調(diào)用:
// 開(kāi)啟分頁(yè) PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.selectUsers(); // 封裝分頁(yè)結(jié)果 PageInfo<User> pageInfo = new PageInfo<>(users);
優(yōu)點(diǎn):
- 自動(dòng)適配不同數(shù)據(jù)庫(kù)的分頁(yè)語(yǔ)法(如 MySQL、Oracle、PostgreSQL)。
- 提供
PageInfo
對(duì)象,包含總記錄數(shù)、總頁(yè)數(shù)、當(dāng)前頁(yè)等分頁(yè)信息。 - 對(duì)代碼侵入性低。
缺點(diǎn):
- 需要引入第三方依賴。
?4. MyBatis-Plus 分頁(yè)插件
原理:MyBatis-Plus 是 MyBatis 的增強(qiáng)工具,內(nèi)置分頁(yè)插件,通過(guò)攔截器實(shí)現(xiàn)物理分頁(yè)。
使用步驟:
?引入依賴:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency>
?配置分頁(yè)插件:
@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
?代碼調(diào)用:
// 創(chuàng)建分頁(yè)參數(shù) Page<User> page = new Page<>(pageNum, pageSize); // 執(zhí)行分頁(yè)查詢 Page<User> result = userMapper.selectPage(page, null); // 獲取分頁(yè)信息 long total = result.getTotal(); List<User> users = result.getRecords();
優(yōu)點(diǎn):
- 與 MyBatis-Plus 深度集成,支持更豐富的 CRUD 操作。
- 自動(dòng)處理分頁(yè)邏輯,返回包含分頁(yè)信息的
Page
對(duì)象。
?5. 自定義分頁(yè)攔截器
- 原理:手動(dòng)實(shí)現(xiàn) MyBatis 的
Interceptor
接口,動(dòng)態(tài)修改 SQL 添加分頁(yè)邏輯。 - 適用場(chǎng)景:
- 需要高度定制化分頁(yè)邏輯(如特殊的分頁(yè)規(guī)則)。避免引入第三方依賴。
缺點(diǎn):
- 開(kāi)發(fā)成本高,需處理不同數(shù)據(jù)庫(kù)的語(yǔ)法差異。
?分頁(yè)方案對(duì)比
?方案 | ?性能 | ?數(shù)據(jù)庫(kù)兼容性 | ?代碼侵入性 | ?適用場(chǎng)景 |
---|---|---|---|---|
原生 SQL 分頁(yè) | 高 | 低(需手動(dòng)適配) | 高 | 簡(jiǎn)單查詢、固定數(shù)據(jù)庫(kù)類型 |
RowBounds | 低 | 高 | 低 | 小數(shù)據(jù)集、邏輯分頁(yè) |
PageHelper | 高 | 高 | 低 | 通用場(chǎng)景,推薦使用 |
MyBatis-Plus | 高 | 高 | 中 | 使用 MyBatis-Plus 的項(xiàng)目 |
自定義攔截器 | 高 | 可定制 | 高 | 特殊需求 |
?總結(jié)
- ?推薦方案:優(yōu)先使用 ?PageHelper 或 ?MyBatis-Plus 分頁(yè)插件,二者均通過(guò)物理分頁(yè)實(shí)現(xiàn)高性能,且對(duì)代碼侵入性低。?
- 性能陷阱:避免使用
RowBounds
處理大數(shù)據(jù)集,可能導(dǎo)致內(nèi)存溢出。? - 數(shù)據(jù)庫(kù)兼容性:若項(xiàng)目需支持多數(shù)據(jù)庫(kù),選擇 PageHelper 或 MyBatis-Plus,它們能自動(dòng)適配不同數(shù)據(jù)庫(kù)的分頁(yè)語(yǔ)法。
到此這篇關(guān)于Mybatis是如何進(jìn)行分頁(yè)的的文章就介紹到這了,更多相關(guān)Mybatis分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatisplus多表關(guān)聯(lián)分頁(yè)查詢多種實(shí)現(xiàn)方式
- SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)示例
- MyBatis中RowBounds實(shí)現(xiàn)內(nèi)存分頁(yè)
- MyBatisPlus 封裝分頁(yè)方法示例
- mybatis-plus 實(shí)現(xiàn)分頁(yè)查詢的示例代碼
- Springboot整合mybatis-plus使用pageHelper進(jìn)行分頁(yè)(使用步驟)
- SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐
- 使用mybatis-plus分頁(yè)出現(xiàn)兩個(gè)Limit的問(wèn)題解決
相關(guān)文章
Java對(duì)Map進(jìn)行按value排序的幾種常見(jiàn)方法
在日常開(kāi)發(fā)中,Map 是我們經(jīng)常使用的數(shù)據(jù)結(jié)構(gòu)之一,盡管 Map 是按鍵 (key) 存儲(chǔ)和檢索數(shù)據(jù)的,但有時(shí)我們需要根據(jù) value 進(jìn)行排序,這篇博客將詳細(xì)探討如何在 Java 中對(duì) Map 進(jìn)行按 value 排序的幾種常見(jiàn)方法,并分析它們的優(yōu)缺點(diǎn),需要的朋友可以參考下2025-03-03Java IO復(fù)用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java IO復(fù)用的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-05-05SpringBoot中基于JWT的單token授權(quán)和續(xù)期方案步驟詳解
在前后端分離架構(gòu)中,用戶登錄后,后端生成JWT?Token返給前端存于LocalStorage,每次請(qǐng)求攜帶Token驗(yàn)證身份,后端校驗(yàn)其有效性,本文給大家介紹SpringBoot中基于JWT的單token授權(quán)和續(xù)期方案步驟詳解,感興趣的朋友一起看看吧2024-09-09SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼
本文主要介紹了SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05淺談Storm在zookeeper上的目錄結(jié)構(gòu)
這篇文章主要介紹了淺談Storm在zookeeper上的目錄結(jié)構(gòu)的相關(guān)內(nèi)容,涉及storm使用zookeeper的操作以及詳細(xì)結(jié)構(gòu)圖,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10使用java實(shí)現(xiàn)字符編碼轉(zhuǎn)換(附源碼)
隨著全球化的軟件應(yīng)用越來(lái)越廣泛,不同平臺(tái)與系統(tǒng)之間的數(shù)據(jù)交換,常常面臨字符集不一致的問(wèn)題,本文主要介紹了如何使用Java進(jìn)行字符編碼轉(zhuǎn)換,需要的可以了解下2025-05-05Java實(shí)現(xiàn)FIFO任務(wù)調(diào)度隊(duì)列策略
在工作中,很多高并發(fā)的場(chǎng)景中,我們會(huì)用到隊(duì)列來(lái)實(shí)現(xiàn)大量的任務(wù)請(qǐng)求。當(dāng)任務(wù)需要某些特殊資源的時(shí)候,我們還需要合理的分配資源,讓隊(duì)列中的任務(wù)高效且有序完成任務(wù)。本文將為大家介紹通過(guò)java實(shí)現(xiàn)FIFO任務(wù)調(diào)度,需要的可以參考一下2021-12-12Java框架篇:Spring+SpringMVC+hibernate整合開(kāi)發(fā)
本篇文章將會(huì)對(duì)Spring+SpringMVC+hibernate的整合開(kāi)發(fā)進(jìn)行介紹。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-02-02