MyBatis-Plus分頁 vs PageHelper分頁:全面對比與最佳實踐
一、分頁技術概述
在Java持久層框架中,分頁是高頻使用的功能。主流方案有:
- MyBatis-Plus分頁:MyBatis增強工具的內置分頁方案
- PageHelper分頁:獨立的MyBatis分頁插件
二、核心相同點
? 基礎功能一致:
- 都支持物理分頁(LIMIT語句)
- 都能返回分頁元數據(當前頁、總頁數等)
- 都基于MyBatis攔截器實現
? 開發體驗:
- 都只需少量代碼即可實現分頁
- 都支持主流關系型數據庫
三、關鍵差異對比
特性 | MyBatis-Plus分頁 | PageHelper分頁 |
---|---|---|
依賴關系 | 需集成MyBatis-Plus | 獨立jar包 |
分頁啟動方式 | 構造Page對象傳參 | ThreadLocal靜態方法 |
返回值 | IPage接口對象 | PageInfo包裝List |
復雜SQL支持 | 有限制(如嵌套查詢可能失效) | 支持更復雜SQL場景 |
多數據源支持 | 需要特殊配置 | 天然支持 |
COUNT查詢 | 自動執行(可關閉) | 自動執行(可關閉) |
與ORM集成 | 深度集成條件構造器 | 兼容任何MyBatis用法 |
四、使用指南
1. MyBatis-Plus分頁使用
① 配置攔截器
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
五、實戰案例
案例1:多表聯合分頁查詢(推薦PageHelper)
// 使用PageHelper
public PageInfo<UserVO> getUsersWithDepartment(int pageNum) {PageHelper.startPage(pageNum, 10);List<UserVO> list = userMapper.selectUsersWithDept();return new PageInfo<>(list);
}// SQL示例
@Select("SELECT u.*, d.dept_name FROM user u LEFT JOIN department d ON u.dept_id = d.id")
List<UserVO> selectUsersWithDept();
案例2:條件構造器分頁(推薦MyBatis-Plus)
public IPage<User> searchUsers(String keyword, int pageNum) {LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();wrapper.like(User::getName, keyword);Page<User> page = new Page<>(pageNum, 10);return userMapper.selectPage(page, wrapper);
}
六、性能優化建議
- 1.關閉COUNT查詢(大數據量時)
// MyBatis-Plus
Page<User> page = new Page<>(pageNum, size, false);// PageHelper
PageHelper.startPage(pageNum, size, false);
- 2.特殊語法支持
// PageHelper對特殊語法更友好
PageHelper.startPage(1, 10).setCount(false);
List<Map<String,Object>> list = starrocksMapper.complexQuery();
-
3.索引優化
-
4.確保分頁字段有索引
-
5.帶排序時建立復合索引
七、技術選型推薦
👉 推薦MyBatis-Plus分頁
當:
項目已集成MyBatis-Plus
需要與條件構造器配合使用
使用標準SQL語法
需要強類型分頁對象
👉 推薦PageHelper
當:
需要兼容原生MyBatis
涉及復雜SQL(嵌套/UNION等)
使用StarRocks等特殊數據庫
需要快速集成多數據源
八、常見問題解答
Q:為什么PageHelper對復雜SQL支持更好?
A:PageHelper采用更"粗放"的攔截方式,不會深度解析SQL,而MyBatis-Plus的攔截器會嘗試智能分析SQL結構。
Q:百萬數據量如何優化?
使用游標分頁(基于排序字段)
禁用COUNT查詢
添加合適的索引
📌 最佳實踐總結:新項目建議統一使用MyBatis-Plus分頁,遺留系統或特殊需求使用PageHelper。無論哪種方案,都應關注分頁性能,避免全表掃描