Mybatis的分頁實現方式
MyBatis 的分頁實現方式主要有以下幾種,每種方式適用于不同的場景,且在性能、靈活性和代碼侵入性上有所差異:
?1. 原生 SQL 分頁(物理分頁)?
原理:直接在 SQL 中編寫數據庫特定的分頁語法(如 MySQL 的 LIMIT、Oracle 的 ROWNUM)。
示例:
<select id="selectUsers" resultType="User">
SELECT * FROM users
LIMIT #{offset}, #{pageSize}
</select>優(yōu)點:
- 性能最優(yōu),直接通過數據庫物理分頁,僅查詢所需數據。
- 無額外依賴,適用于簡單場景。
缺點:
- SQL 與數據庫類型綁定,切換數據庫需修改 SQL。
- 需要手動計算分頁參數(offset、pageSize)。
?2. RowBounds 分頁(邏輯分頁)?
原理:通過 MyBatis 的 RowBounds 對象實現內存分頁(邏輯分頁)。查詢時會獲取全部數據,但在內存中截取指定范圍。
示例:
List<User> users = sqlSession.selectList("selectUsers", null, new RowBounds(offset, pageSize));優(yōu)點:
- 代碼簡單,無需修改 SQL。
- 兼容所有數據庫。
缺點:
- ?性能差:數據量大時會導致內存溢出或查詢緩慢(需全量加載數據)。
- 僅適用于小數據集。
?3. PageHelper 插件(推薦)?
原理:通過攔截器動態(tài)修改 SQL,自動添加分頁語句(物理分頁)。支持多種數據庫,并封裝分頁結果(總條數、頁碼等)。
使用步驟:
?引入依賴:
<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"/> <!-- 指定數據庫類型 -->
</plugin>
</plugins>?代碼調用:
// 開啟分頁 PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.selectUsers(); // 封裝分頁結果 PageInfo<User> pageInfo = new PageInfo<>(users);
優(yōu)點:
- 自動適配不同數據庫的分頁語法(如 MySQL、Oracle、PostgreSQL)。
- 提供
PageInfo對象,包含總記錄數、總頁數、當前頁等分頁信息。 - 對代碼侵入性低。
缺點:
- 需要引入第三方依賴。
?4. MyBatis-Plus 分頁插件
原理:MyBatis-Plus 是 MyBatis 的增強工具,內置分頁插件,通過攔截器實現物理分頁。
使用步驟:
?引入依賴:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency>
?配置分頁插件:
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}?代碼調用:
// 創(chuàng)建分頁參數 Page<User> page = new Page<>(pageNum, pageSize); // 執(zhí)行分頁查詢 Page<User> result = userMapper.selectPage(page, null); // 獲取分頁信息 long total = result.getTotal(); List<User> users = result.getRecords();
優(yōu)點:
- 與 MyBatis-Plus 深度集成,支持更豐富的 CRUD 操作。
- 自動處理分頁邏輯,返回包含分頁信息的
Page對象。
?5. 自定義分頁攔截器
- 原理:手動實現 MyBatis 的
Interceptor接口,動態(tài)修改 SQL 添加分頁邏輯。 - 適用場景:
- 需要高度定制化分頁邏輯(如特殊的分頁規(guī)則)。避免引入第三方依賴。
缺點:
- 開發(fā)成本高,需處理不同數據庫的語法差異。
?分頁方案對比
| ?方案 | ?性能 | ?數據庫兼容性 | ?代碼侵入性 | ?適用場景 |
|---|---|---|---|---|
| 原生 SQL 分頁 | 高 | 低(需手動適配) | 高 | 簡單查詢、固定數據庫類型 |
| RowBounds | 低 | 高 | 低 | 小數據集、邏輯分頁 |
| PageHelper | 高 | 高 | 低 | 通用場景,推薦使用 |
| MyBatis-Plus | 高 | 高 | 中 | 使用 MyBatis-Plus 的項目 |
| 自定義攔截器 | 高 | 可定制 | 高 | 特殊需求 |
?總結
- ?推薦方案:優(yōu)先使用 ?PageHelper 或 ?MyBatis-Plus 分頁插件,二者均通過物理分頁實現高性能,且對代碼侵入性低。?
- 性能陷阱:避免使用
RowBounds處理大數據集,可能導致內存溢出。? - 數據庫兼容性:若項目需支持多數據庫,選擇 PageHelper 或 MyBatis-Plus,它們能自動適配不同數據庫的分頁語法。
到此這篇關于Mybatis是如何進行分頁的的文章就介紹到這了,更多相關Mybatis分頁內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot如何整合mybatis-generator-maven-plugin 1.4.0
這篇文章主要介紹了SpringBoot整合mybatis-generator-maven-plugin 1.4.0的實現方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-01-01
springboot+vue實現阿里云oss大文件分片上傳的示例代碼
阿里云推出了直傳,本文主要介紹了springboot+vue實現阿里云oss大文件分片上傳的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-06-06
Spring?Cloud?Gateway?2.x跨域時出現重復Origin的BUG問題
這篇文章主要介紹了Spring?Cloud?Gateway?2.x跨域時出現重復Origin的BUG問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
通過實例深入學習Java的Struts框架中的OGNL表達式使用
這篇文章主要通過實例介紹了Java的Strus框架中的OGNL表達式使用,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-11-11
java源碼解析之String類的compareTo(String otherString)方法
這篇文章主要給大家介紹了關于java源碼解析之String類的compareTo(String otherString)方法的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧2018-09-09

