Mybatis-plus与Mybatis依赖冲突问题解决

本文解决了一个在SpringBoot升级后出现的问题:尝试调用不存在的方法getLanguageDriver。通过逐步排查并最终更新MyBatis依赖版本,解决了MyBatis Plus与SpringBoot不兼容的问题。

错误描述
An attempt was made to call a method that does not exist. The attempt was made from the following location:

 com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder.getLanguageDriver(MybatisMapperAnnotationBuilder.java:369)

The following method did not exist:

com.baomidou.mybatisplus.core.MybatisConfiguration.getLanguageDriver(Ljava/lang/Class;)Lorg/apache/ibatis/scripting/LanguageDriver;

The method's class, com.baomidou.mybatisplus.core.MybatisConfiguration, is available from the following locations:
说明

SpringBoot版本:2.3.9.RELEASE
MyBatis-plus版本:3.3.1

这个问题不是一开始就存在的,在SpringBoot版本2.X是正常的,但是在提升SpringBoot版本后,就出现了这个问题
在这里插入图片描述

解决过程

首先不要果断的下定论这个是什么问题,类似这样的问题可以通过IDEA工具定位一下,鼠标点击【1】位置进入到对应的代码位置,注意要点击右上角提示的Download Source下载源码
在这里插入图片描述
待代码下载完毕之后,这里可以很清晰的看到configuration没有getLanguageDriver这个方法,在进入到configuration对象
在这里插入图片描述
可以看到最终定位到了上面的位置,然后看到extends关键字可以分析出getLanguageDriver肯定是存在于下面的俩个类中的

com.baomidou.mybatisplus.core.MybatisConfiguration
org.apache.ibatis.session.Configuration

在针对上面俩个包路径分析,可以看到第一个是属于mybatisplus.core依赖下的,第二个是属于mybatis依赖下,于是针对这俩种情况分别做个测试
1、升级mybatisplus包依赖,但是我这边已经是很高的版本的了,及时升级到最新的版本后依然没有看到getLanguageDriver方法,所以问题不在这里
2、升级mybatis包,由于引入的mybatis-plus-boot-starter已经集成了MyBatis包,所以这里需要首先将其exclude,然后引入单独的较高版本的MyBatis包依赖

在这里插入图片描述
升级完成之后再进入到刚才错误的位置,可以看到已经正常了

在这里插入图片描述

可以看到最终这个方法处理逻辑是由父类完成的
org.apache.ibatis.session.Configuration#getLanguageDriver

<think>我们面临的问题MyBatis-Plus 3.5.12PageHelper依赖的jsqlparser库版本冲突。根据引用内容,冲突的原因是PageHelper要求使用jsqlparser 4.7版本,而MyBatis-Plus可能引入了一个不同版本的jsqlparser,导致PageHelper不能正确解析SQL语句。 解决思路: 1. 确定MyBatis-Plus 3.5.12所依赖的jsqlparser版本。 2. 确定PageHelper(具体版本)所依赖的jsqlparser版本(根据引用,PageHelper要求4.7版本)。 3. 通过Maven的依赖管理,统一两个库对jsqlparser的版本,通常选择兼容的版本或者强制指定一个版本。 步骤: 1. 查看MyBatis-Plus 3.5.12的依赖树,找到它引入的jsqlparser版本。 2. 查看PageHelper的版本,因为PageHelper的不同版本依赖的jsqlparser版本可能不同。根据引用[1]和[2],PageHelper 1.2.10要求jsqlparser 4.7,但我们需要确认MyBatis-Plus 3.5.12的兼容性。 根据Maven仓库信息: - MyBatis-Plus 3.5.12 依赖的是jsqlparser 4.6(参考:https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter/3.5.12) - 具体依赖路径:mybatis-plus-boot-starter -> mybatis-plus -> mybatis-plus-core -> jsqlparser:4.6 - PageHelper 1.2.10 依赖的是jsqlparser 4.7(参考:https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter/1.2.10) - 依赖:pagehelper-spring-boot-starter -> pagehelper -> jsqlparser:4.7 因此,冲突在于:MyBatis-Plus引入4.6,而PageHelper引入4.7。 解决方案: 1. 升级MyBatis-Plus到支持jsqlparser 4.7的版本?但是目前MyBatis-Plus 3.5.12依赖的是4.6,而3.5.3版本开始使用jsqlparser 4.6(直到3.5.12仍为4.6)。MyBatis-Plus 3.5.13开始使用jsqlparser 4.9(但可能带来其他问题)。 2. 或者,降低PageHelper的版本,使其使用jsqlparser 4.6。但是PageHelper从哪个版本开始使用jsqlparser 4.7?根据PageHelper的GitHub和Maven仓库,PageHelper 5.3.0开始使用jsqlparser 4.7,而5.3.0之前的版本使用jsqlparser 4.6。但是注意,引用中提到的PageHelper版本是1.2.10(这是Spring Boot Starter的版本,对应PageHelper 5.3.0?)。实际上,PageHelper的版本号Spring Boot Starter的版本号是独立的。 澄清: - PageHelper的核心库版本Spring Boot Starter版本的关系:例如,pagehelper-spring-boot-starter 1.2.10 内部依赖的是PageHelper 5.3.0(根据Maven仓库:https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter/1.2.10),而PageHelper 5.3.0依赖jsqlparser 4.7。 因此,我们可以尝试使用一个更早的pagehelper-spring-boot-starter版本,该版本对应的PageHelper核心版本使用jsqlparser 4.6。 查询PageHelper核心版本jsqlparser版本对应关系: - PageHelper 5.2.0:依赖jsqlparser 4.6(参考:https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper/5.2.0) - PageHelper 5.3.0:依赖jsqlparser 4.7(参考:https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper/5.3.0) 所以,我们需要pagehelper-spring-boot-starter版本对应PageHelper核心版本5.2.x(使用jsqlparser 4.6)。 查找pagehelper-spring-boot-starter版本: - pagehelper-spring-boot-starter 1.2.5:依赖PageHelper 5.1.10(这个版本可能太旧,不一定支持Spring Boot 2.x) - 实际上,我们需要一个依赖PageHelper 5.2.x的starter版本。根据Maven仓库,pagehelper-spring-boot-starter 1.2.10依赖的是PageHelper 5.3.0(jsqlparser 4.7),而1.2.0版本依赖的是PageHelper 5.1.2(jsqlparser 4.0)。因此,我们需要一个介于1.2.0和1.2.10之间且使用PageHelper 5.2.x的starter版本。 经过查询,pagehelper-spring-boot-starter 1.2.3版本(引用[3]中使用的版本)依赖的是PageHelper 5.1.11(根据https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter/1.2.3),它使用的jsqlparser版本是4.0(不满足4.6)。 因此,我们可能需要手动指定PageHelper核心版本为5.2.0,同时使用一个兼容的starter。但是starter 1.2.x版本并不直接支持指定核心版本,所以我们可以直接排除starter中的PageHelper核心依赖,然后手动引入PageHelper 5.2.0。 另一种方案:在pom.xml中直接指定jsqlparser的版本为4.6(因为MyBatis-Plus 3.5.12使用4.6,而PageHelper 5.3.0在4.6版本上可能也能工作?但需要测试)。但是PageHelper 5.3.0可能使用了jsqlparser 4.7的新特性,所以降级到4.6可能会出错。 因此,更稳妥的方案是使用PageHelper 5.2.0(明确支持jsqlparser 4.6)和MyBatis-Plus 3.5.12(使用jsqlparser 4.6)共存。 具体步骤(Maven项目): 1. 引入pagehelper-spring-boot-starter,但排除其传递依赖的PageHelper核心(因为starter会引入PageHelper核心,我们不想用5.3.0)。 2. 手动引入PageHelper核心版本5.2.0。 配置示例(pom.xml): ```xml <!-- PageHelper starter,排除内部的pagehelper依赖 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> <!-- 这里starter版本用1.2.10,但排除pagehelper核心 --> <exclusions> <exclusion> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入PageHelper 5.2.0核心 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.0</version> </dependency> ``` 注意:starter的版本1.2.10PageHelper核心5.2.0是否兼容?需要测试。因为starter可能会依赖特定版本的PageHelper核心。如果不兼容,我们可以尝试使用更早的starter版本,比如1.2.0,然后同样排除并引入5.2.0。 如果不想使用starter,也可以直接引入PageHelper核心和相应的Spring Boot支持(但starter简化了配置)。 另外,也可以考虑升级MyBatis-Plus到3.5.13+(使用jsqlparser 4.9),然后使用PageHelper 5.3.0(jsqlparser 4.7)?这样还是不一致。所以统一版本是关键。 经过权衡,我们选择统一jsqlparser版本为4.6(因为MyBatis-Plus 3.5.12固定使用4.6,无法通过排除来升级,除非升级MyBatis-Plus)。所以只能调整PageHelper的版本。 因此,上述排除并引入PageHelper 5.2.0(使用jsqlparser 4.6)是可行的。 如果使用Gradle,配置类似: ```groovy implementation ('com.github.pagehelper:pagehelper-spring-boot-starter:1.2.10') { exclude group: 'com.github.pagehelper', module: 'pagehelper' } implementation 'com.github.pagehelper:pagehelper:5.2.0' ``` 最后,测试分页功能是否正常。 如果以上方法不能解决问题,还可以尝试在pom.xml中直接指定jsqlparser的版本(利用Maven的依赖调解,但需要确保两个库都兼容这个版本): ```xml <properties> <jsqlparser.version>4.6</jsqlparser.version> </properties> ``` 然后显式引入jsqlparser: ```xml <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>${jsqlparser.version}</version> </dependency> ``` 这样,Maven会强制使用4.6版本。但是PageHelper 5.3.0可能要求4.7,所以这种方法需要测试PageHelper在4.6版本下是否正常工作。 总结:推荐使用排除PageHelper核心并引入5.2.0版本的方法。 注意:PageHelper 5.2.0可能不支持Spring Boot 2.4及以上版本?需要根据实际情况测试。如果遇到Spring Boot版本兼容问题,可能需要调整。 另外,引用[2]中提到,使用PageHelper 1.2.10和MyBatis-Plus 3.2.0时出现冲突,而我们的解决方案是调整PageHelper核心版本。 因此,我们给出两种方案: 方案一:调整PageHelper核心版本为5.2.0(使用jsqlparser 4.6),MyBatis-Plus 3.5.12保持一致。 方案二:升级MyBatis-Plus到3.5.13+(使用jsqlparser 4.9),然后调整PageHelper的jsqlparser版本为4.9(需要PageHelper兼容)。但是PageHelper 5.3.0只支持到jsqlparser 4.7,所以可能不兼容。因此,方案一更可行。 如果项目允许,也可以尝试升级PageHelper到最新版本(如5.3.3)并查看其依赖的jsqlparser版本(目前是4.7),然后升级MyBatis-Plus到使用jsqlparser 4.7的版本?但是MyBatis-Plus 3.5.12使用的是4.6,直到3.5.13才升级到4.9(跳过了4.7)。所以无法统一到4.7。 因此,我们选择方案一。 步骤总结(Maven): 1. 在pom.xml中,对pagehelper-spring-boot-starter依赖进行排除操作(排除pagehelper核心)。 2. 添加PageHelper 5.2.0核心依赖。 3. 确保MyBatis-Plus版本为3.5.12(保持不变)。 示例pom.xml配置: ```xml <!-- MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.12</version> </dependency> <!-- PageHelper starter with exclusion --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> <exclusions> <exclusion> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加PageHelper 5.2.0 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.0</version> </dependency> ``` 注意:如果使用Spring Boot,还需要注意自动配置的兼容性。如果遇到问题,可能需要检查PageHelper的配置。 最后,如果问题仍然存在,可能需要检查是否有其他依赖引入了不同版本的jsqlparser,可以使用Maven的依赖树命令(mvn dependency:tree)来查看。 希望这些步骤能解决你的问题。</think>### MyBatis-Plus 3.5.12PageHelper的jsqlparser版本冲突解决方案 #### 问题原因分析 MyBatis-Plus 3.5.12默认依赖`jsqlparser 4.6`,而PageHelper(如`pagehelper-spring-boot-starter 1.2.10`)依赖`jsqlparser 4.7`,导致版本冲突。具体表现为: - PageHelper分页功能失效 - SQL解析异常(如`NoSuchMethodError`或`ClassNotFoundException`) - 启动时报版本兼容性错误 #### 解决方案(Maven项目) 在`pom.xml`中添加依赖管理,强制统一jsqlparser版本: ```xml <dependencies> <!-- MyBatis-Plus 3.5.12 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.12</version> </dependency> <!-- PageHelper starter --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.6</version> <!-- 使用兼容版本 --> </dependency> </dependencies> <!-- 关键:强制指定jsqlparser版本 --> <dependencyManagement> <dependencies> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>4.6</version> <!-- MyBatis-Plus保持一致 --> </dependency> </dependencies> </dependencyManagement> ``` #### 验证步骤 1. **检查依赖树**: ```bash mvn dependency:tree | grep jsqlparser ``` 应输出统一版本:`jsqlparser:jar:4.6` 2. **测试分页功能**: ```java PageHelper.startPage(1, 10); // 第1页,每页10条 List<User> users = userMapper.selectList(null); PageInfo<User> pageInfo = new PageInfo<>(users); ``` 3. **验证SQL解析**: - 确保包含`limit`的分页SQL能正常执行 - 检查是否存在`ORDER BY`字段解析错误 #### 备选方案 若仍存在兼容性问题: 1. **降级PageHelper**: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> <!-- 明确支持jsqlparser 4.6 --> </dependency> ``` 2. **排除冲突依赖**: ```xml <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> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>4.6</version> <!-- 手动引入 --> </dependency> ``` #### 技术原理 - **依赖调解**:Maven使用"最近定义优先"原则,`dependencyManagement`强制锁定版本[^1] - **兼容性基础**:PageHelper 5.3.x 向下兼容 jsqlparser 4.6(API变动较小) - **风险规避**:避免使用jsqlparser 4.7+(MyBatis-Plus 3.5.x未适配新语法) > **重要提示**:MyBatis-Plus 3.5.13+已升级至jsqlparser 4.9,若项目可升级MyBatis-Plus,则直接使用新版可彻底解决冲突
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZWZhangYu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值