You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:00:13