1. 项目概述
最近在技术社区看到不少开发者反馈MyBatis-Plus分页插件突然失效的问题,特别是在同时使用PageHelper的场景下。作为一个长期使用MyBatis-Plus的老手,我深知这背后的"假分页"陷阱有多隐蔽。今天我们就来彻底扒开这个问题的底层原理,让你不仅知道怎么解决,更明白为什么会出现这种情况。
这个问题通常表现为:明明配置了MyBatis-Plus的分页插件,查询时也传入了Page对象,但执行的SQL却没有LIMIT语句,返回的却是全部数据。更诡异的是,单独测试MyBatis-Plus分页功能时一切正常,只有当项目中同时存在PageHelper时才会出现这种情况。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理剖析
2.1 MyBatis-Plus分页机制
MyBatis-Plus的分页插件(PaginationInnerInterceptor)是通过MyBatis的拦截器机制实现的。它的核心工作流程是这样的:
- 拦截Executor的query方法
- 判断方法参数中是否包含IPage实例
- 如果有分页参数,就改写原始SQL,添加LIMIT语句
- 执行count查询获取总数
- 返回封装好的Page对象
关键源码片段(简化版):
java复制public class PaginationInnerInterceptor implements InnerInterceptor {
@Override
public void beforeQuery(Executor executor, MappedStatement ms,
Object parameter, RowBounds rowBounds, ResultHandler resultHandler,
BoundSql boundSql) {
if (parameter instanceof IPage) {
// 处理分页逻辑
String originalSql = boundSql.getSql();
String pageSql = dialect.buildPaginationSql(original
