MyBatis分页插件混用问题解析:IPage与PageHelper的冲突与解决
一、背景
在同时使用 MyBatis-Plus 的 IPage 分页 和 PageHelper 时,开发者可能会遇到以下两类问题:
- 分页结果异常:IPage 查询的 total 总条数返回 0,但实际数据正常。
- 依赖冲突报错:启动时报错 Column.withColumnName() 方法不存在,因 jsqlparser 版本不兼容。
二、分析
1、问题一:IPage 查询的 total 为 0
(1)原因:
-
拦截器冲突:PageHelper和MyBatis-Plus的分页拦截器均会修改SQL,导致分页逻辑被覆盖。
-
分页参数残留:PageHelper通过ThreadLocal保存分页参数,若未清除,会影响后续IPage查询。
(2)解决方案
- 统一分页工具:避免混用,统一使用MyBatis-Plus的IPage或PageHelper。
- 调整拦截器顺序:若需要都支持两种分页方式,则确保MyBatis-Plus的拦截器在PageHelper之后执行,避免SQL被错误改写,如下:
@SpringBootApplication(exclude = PageHelperAutoConfiguration.class) // 禁用PageHelper自动配置
public class Application { ... }
@Configuration
public class MyBatisConfig {
// 先注册PageHelper拦截器
@Bean
public PageInterceptor pageInterceptor() {
PageInterceptor pageInterceptor = new PageInterceptor();
Properties props = new Properties();
props.setProperty("helperDialect", "mysql");
pageInterceptor.setProperties(props);
return pageInterceptor;
}
// 后注册MyBatis-Plus拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2、问题一:jsqlparser版本冲突报错
(1)报错信息如下:
Caused by: java.lang.NoSuchMethodError:
net.sf.jsqlparser.schema.Column.withColumnName(Ljava/lang/String;)Lnet/sf/jsqlparser/schema/Column;
(2)原因:
MyBatis-Plus的PaginationInnerInterceptor依赖jsqlparser 4.5+,而PageHelper可能引入旧版本(如3.2),导致方法缺失。
(3)解决方案
- 升级jsqlparser版本,并显式引入高版本jsqlparser(如4.6)
- 推荐 MyBatis-Plus 3.5.3+(兼容 jsqlparser 4.6)
<!-- 排除 PageHelper 中的旧版本 jsqlparser -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
<exclusions>
<exclusion>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 显式引入新版本 jsqlparser -->
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.6</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version> <!-- 使用最新版本 -->
</dependency>