MyBatis使用PageHelper分页无性能提升问题求助
排查PageHelper未实现物理分页的问题
我来帮你一步步分析这个问题——你遇到的核心是PageHelper插件看似已经配置,但实际没生效做物理分页,导致查询耗时和未使用时几乎一致。咱们从几个关键方向排查:
1. 先解决依赖冲突问题
你当前的Gradle配置同时引入了本地lib目录的jar包和Maven仓库的依赖,这很容易导致版本冲突:
dependencies { compile fileTree(dir: 'lib', include: ['*.jar']) // 包含lib下所有jar compile 'com.github.pagehelper:pagehelper:3.2.1' // 又单独引入仓库版本 compile files("lib/jsqlparser-3.0.jar") // 重复引入jsqlparser }
- 问题点:如果
lib目录里还有另一个版本的PageHelper jar,两个版本的类会互相干扰,导致插件无法正常初始化和拦截SQL。 - 解决方法:二选一即可:
- 删掉
lib目录下的PageHelper和jsqlparser jar,只保留Maven仓库的依赖(推荐,避免手动管理jar); - 去掉Gradle中
compile 'com.github.pagehelper:pagehelper:3.2.1'这一行,确保lib里的PageHelper版本和jsqlparser版本匹配(3.2.1版本的PageHelper对应jsqlparser 0.9.x左右,你用的3.0版本可能不兼容!)
- 删掉
2. 调整分页调用方式
你当前用的是RowBounds传参的方式,但PageHelper 3.x版本对这种方式的支持有局限性,尤其是配合supportMethodsArguments=true配置时,这个参数是针对Mapper接口方法参数的分页,而非SqlSession直接调用的场景。
试试用PageHelper官方推荐的调用方式,在查询前手动开启分页:
// 先开启分页,参数:页码(从1开始)、每页数量 PageHelper.startPage(1, 100); // 直接调用selectList,不需要传RowBounds List<E> pendingRequests = getSqlSession().<E>selectList("fetchAllPendingRequests", inputData);
这种方式是PageHelper最稳定的触发方式,能直接验证插件是否能拦截SQL并生成LIMIT语句。
3. 优化插件配置项
你的插件配置里有几个参数可能存在冲突或冗余:
<value> helperDialect=mysql reasonable=true supportMethodsArguments=true params=count=countSql autoRuntimeDialect=true </value>
- 去掉
autoRuntimeDialect=true:你已经明确指定了helperDialect=mysql,自动检测方言会多此一举,甚至可能在3.2.1版本里导致逻辑冲突; - 暂时注释
reasonable=true:这个参数会把小于1的页码自动修正为1,你的RowBounds(0,100)会被改成页码1,但这不会导致不分页,不过先简化配置排除干扰; - 保留
supportMethodsArguments=true即可,但只在使用Mapper接口参数分页时生效,当前场景暂时用不上。
调整后的配置可以简化为:
<value> helperDialect=mysql params=count=countSql </value>
4. 验证SQL是否真的生成了分页
最直接的方式是开启MyBatis的SQL日志,确认执行的SQL是否包含LIMIT关键字。在你的MapConfig.xml中添加日志配置:
<settings> <!-- 开启控制台打印SQL --> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
启动项目执行查询后,查看控制台输出的SQL:
- 如果没有
LIMIT 100,说明插件完全没生效,回到依赖和配置排查; - 如果有
LIMIT但耗时还是和全表查询差不多,那可能是你的表数据量太小,全表查询和分页查询的耗时差异不明显,可以测试更大的页码或更多数据量验证。
5. 检查版本兼容性
PageHelper 3.2.1是比较老的版本,对MyBatis和Spring的版本有要求:
- 兼容MyBatis 3.2.x及以上版本;
- 兼容Spring 3.2.x及以上版本;
如果你的项目里MyBatis或Spring版本太新(比如MyBatis 3.5+),可能导致插件无法正常拦截SQL执行流程。可以查看PageHelper 3.2.1的官方文档确认兼容版本,必要时升级PageHelper到更适配的版本(比如4.x或5.x)。
内容的提问来源于stack exchange,提问作者scottstots
相关产品推荐
相关产品推荐

