问题背景
最近需要把项目的mybatis换成mybatis-plus,前期一切正常,可是遇到分页查询的时候,发现pagehelper失效了,但是mybatis-plus自带的分页插件PaginationInnerInterceptor
又是正常的,由于项目前期使用的都是pagehelper分页,如果全部替换成mybatis-plus的分页改动的地方很多,并且工作量和风险也大,作为一个有原则的程序员,遇到这种问题就来劲了(领导逼的),下面就记录下问题发现和解决过程。
问题原因
原因只有一个,jar包冲突,主要是com.github.jsqlparser:jsqlparser
这个包冲突。
我们使用mybatis-plus分页插件的时候,需要配置一个分页的拦截器,如下:
@Configuration
public class MybatisPlusConfig {
/**
* 分页配置
*/
@Bean
public MybatisPlusInterceptor innerInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//这里是重点
return interceptor;
}
/**
* sql增强配置
*/
@Bean
public MybatisPlusSqlInjector easySqlInjector() {
return new MybatisPlusSqlInjector();
}
}
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL))
这个拦截器里面如下:
net.sf.jsqlparser.statement.select.SelectExpressionItem.withAlias
这个方法只有在jsqlparser 4.0
及以上版本才有。
而pagehelper也用到了这个包,用的net.sf.jsqlparser.statement.select.PlainSelect.getGroupByColumnReferences
方法,而这个方法只有在jsqlparser 1.4
及以下版本才有。
所以,如果同时配置了mybatis-plus的PaginationInnerInterceptor
并且引入了pagehelper包,那么,这个时候pagehelper分页会失效,只有mybatis-plus的分页才能正常使用。
解决方案
最简单的解决方案,就是看项目具体想用哪种,因为它们二者不能共存(自己重写jsqlparser包的不算),个人偏向使用mybatis-plus的分页插件,mybatisplus 使用的部分jar包 版本高于 pagehelper 未经过测试 不知道降低适配是否导致隐形问题。毕竟既然使用了mybatis-plus,何必再降低版本去兼容pagehelper,只是有时候开发就这样,改动太大,不敢改,所以妥协。
如果坚持使用pagehelper,那么可以把mybatis-plus-extension
中的jsqlparser
包剔除掉
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.3.4</version>
<exclusions>
<exclusion>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</exclusion>
</exclusions>
</dependency>