MyBatis分页插件使用优缺点详解(附高频面试题解)

👉 2025年Java面试宝典抢先领:
点击下载
提取码:9b3g (覆盖Spring/MySQL/分布式等高频考点)
一、为什么需要MyBatis分页插件?
面试被问“MyBatis如何实现高效分页”千万别懵!传统limit offset在百万数据下性能崩盘是必然的。比如你查第100万页数据:
SELECT * FROM table LIMIT 10 OFFSET 1000000
数据库需要先扫描100万+10条记录再丢前100万条——这就是分页插件存在的核心意义。
二、分页插件是怎么工作的?
以PageHelper为例(市占超90%),本质是MyBatis拦截器:
// 伪代码:拦截SQL请求
public Object intercept(Invocation iv) throws Throwable {
if (需要分页) {
String newSql = "SELECT COUNT(*) FROM (" + originalSql + ")";
int total = queryTotal(newSql); // 先查总数
String pageSql = dialect.getPageSql(originalSql, pageNum, pageSize);
return execute(pageSql); // 改写为分页SQL
}
return iv.proceed();
}
关键动作:
- 自动追加
COUNT(*)查询获取总量 - 用数据库方言(如MySQL的
LIMIT、Oracle的ROWNUM)重构原始SQL - 封装成
PageInfo对象(含页码/总量/数据列表)
三、MyBatis分页插件的核心优势
- 性能救星
- 避免全表扫描:只查当前页所需数据
- 内存优化:百万级数据分页内存占用降低90%+
- 开发提效
// 原始方式:手动拼接SQL String sql = "SELECT * FROM user LIMIT " + start + "," + pageSize; // PageHelper:一行代码 PageHelper.startPage(2, 10); // 第2页,每页10条 List<User> users = userMapper.selectAll(); - 多数据库无缝切换
插件自动识别MySQL/Oracle/PostgreSQL等方言,业务代码零修改
四、这些坑你踩过吗?(典型缺点分析)
-
线程安全陷阱
PageHelper.startPage()基于ThreadLocal,若在异步线程调用会导致分页混乱:CompletableFuture.runAsync(() -> { PageHelper.startPage(1,10); // 异步线程ThreadLocal隔离失效! userService.query(); });解法:在异步任务内显式调用
PageHelper.clearPage() -
一对多查询的计数灾难
当主表关联子表时:SELECT * FROM order o LEFT JOIN item i ON o.id=i.order_id自动生成的
COUNT(*)语句会导致重复计数(1个订单对应N个商品)
急救方案:PageHelper.startPage(1,10).count(false)手动关闭计数 -
内存溢出风险
误用PageHelper后接着全表查询:PageHelper.startPage(1,10); List<User> allUsers = userMapper.selectAll(); // 实际查了全表!结果:内存加载全量数据(10万+条),仅截取前10条——分了个寂寞💥
五、面试这样答秒杀90%候选人
面试官:你们的分页方案遇到过分页深度过大的问题吗?
高分局答案:
“我们通过分页插件+游标分页双方案应对:
- 常规列表用PageHelper,限制最大页码(如只允许查前100页)
- 深度分页(如导出)改用
基于有序键游标:
SELECT * FROM table WHERE id > #{lastId} ORDER BY id LIMIT 1000
避免OFFSET带来的性能悬崖”
六、最佳实践路线图

- 基础配置
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> </plugin> </plugins> - 防御性编程
- 强制
pageSize上限(如≤100) - 监控慢分页SQL(执行时间>500ms报警)
- 强制
- 海量数据场景
结合Elasticsearch做二级分页,扛住千万级查询
🚀 技术人精打细算指南
想刷Java面试题库?面试鸭返利网会员直降25元!
通过官网链接下单时备注“技术分页”即可返现,实测有效👇

关键结论:MyBatis分页插件是把双刃剑——用对场景提效10倍,盲目使用反成性能杀手。掌握其运作机制与避坑姿势,面试实战皆从容。


