java.lang.NoSuchMethodException: org.apache.ibatis.executor.statement.StatementHandler.prepare(java.

本文详细解析了在使用MyBatis 3.4.6版本时,配置自定义拦截器遇到的NoSuchMethodException异常。通过调整拦截器规则,增加了Integer参数,成功解决了prepare方法签名不匹配的问题。

今天在使用MyBatis的过程中,想使用一下自定义拦截器,结果出现了一下异常信息:

Caused by: org.apache.ibatis.plugin.PluginException: Could not find method on interface org.apache.ibatis.executor.statement.StatementHandler named prepare. Cause: java.lang.NoSuchMethodException: org.apache.ibatis.executor.statement.StatementHandler.prepare(java.sql.Connection)
    at org.apache.ibatis.plugin.Plugin.getSignatureMap(Plugin.java:87)
    at org.apache.ibatis.plugin.Plugin.wrap(Plugin.java:44)
    at A1003.Mybatis的拦截器.MyInterceptor.plugin(MyInterceptor.java:38)
    at org.apache.ibatis.plugin.InterceptorChain.pluginAll(InterceptorChain.java:31)
    at org.apache.ibatis.session.Configuration.newExecutor(Configuration.java:581)
    at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:96)
    ... 2 more
Caused by: java.lang.NoSuchMethodException: org.apache.ibatis.executor.statement.StatementHandler.prepare(java.sql.Connection)
    at java.lang.Class.getMethod(Class.java:1786)
    at org.apache.ibatis.plugin.Plugin.getSignatureMap(Plugin.java:84)
    ... 7 more

以下是我的配置版本信息:

     <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.1.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.24</version>
        </dependency>

后来在查阅了相关资料之后发现,使用mybatis3.4版本以上,配置拦截器规则应增加Intger参数,如下:

@Intercepts({
        @Signature(method = "query", type = Executor.class, args = {
                MappedStatement.class, Object.class, RowBounds.class,
                ResultHandler.class}),
        @Signature(method = "prepare", type = StatementHandler.class, args = {Connection.class,Integer.class})
})
<think>嗯,用户这次遇到了MyBatis的特定错误:"Could not find method on interface org.apache.ibatis.executor.resultset.ResultSetHandler named handleResultSets"。虽然用户提供的引用内容主要是关于StatementHandlerExecutor接口的错误,但核心问题都是类似的——插件与MyBatis版本不兼容导致的接口方法缺失。 用户可能正在开发或维护一个使用MyBatis的项目,突然遇到这个启动错误,比较着急。从ta能准确描述错误信息来看,应该是有一定技术背景的开发人员。不过ta提供的引用材料里并没有直接提到ResultSetHandler的问题,需要我根据同类错误的解决思路来推导方案。 这个错误的本质是:某个插件(很可能是分页插件如PageHelper)试图拦截ResultSetHandler.handleResultSets()方法,但当前MyBatis版本的ResultSetHandler接口中不存在这个方法。可能原因有: 1)插件版本过新,支持的是更高版本MyBatis的方法签名 2)MyBatis版本过新,删除了旧的接口方法 3)插件配置错误导致加载了不匹配的拦截器 需要特别注意handleResultSets方法在MyBatis的演化: - MyBatis 3.4.0开始,ResultSetHandler接口增加了handleCursorResultSets等方法 - MyBatis 3.5.0重命名了部分方法,handleResultSets可能被调整过 处理策略应该分三步走: 首先检查版本兼容性,这是最常见的根源。要让用户确认MyBatis和PageHelper(或其他插件)的版本匹配关系。比如PageHelper 5.x要求MyBatis ≥3.4.0,如果用户用的是MyBatis 3.2.x就会出问题。 其次检查插件配置。用户可能错误配置了@Signature注解的method名称或参数列表。例如handleResultSets方法在3.5.0后需要三个参数而非两个。 最后考虑类加载冲突。有些项目依赖了多个MyBatis版本,容器可能加载了错误的接口定义。需要让用户检查依赖树里是否有冲突的mybatis-core包。 在回答时要给出具体的版本对照表示例,比如列出PageHelper常见版本对应的MyBatis要求。还要提醒用户检查其他潜在插件,比如性能监控插件也可能导致同类错误。最好给出mvn dependency:tree命令的使用示例,这对Java开发者是基本技能。 最后考虑补充一个故障排查流程图:从错误日志定位到具体缺失的方法 → 确定相关插件 → 检查插件要求的MyBatis版本 → 升级/降级 → 验证。这样用户下次遇到类似问题也能自主处理。 </think>### 解决 MyBatis 中 `Could not find method on interface org.apache.ibatis.executor.resultset.ResultSetHandler named handleResultSets` 错误的方法 该错误通常由 **插件与 MyBatis 核心版本不兼容** 引起,以下是具体解决方案: #### ✅ 核心解决步骤 1. **版本兼容性检查(关键)** - 🔍 **确认 MyBatis 版本**:检查项目的 `mybatis-core` 版本(如 3.4.0、3.5.0)。 - 🔍 **检查插件版本**:分页插件(如 PageHelper)、性能监控插件等需与 MyBatis 版本匹配。 - 📌 **兼容对照示例**: | MyBatis 版本 | PageHelper 推荐版本 | |--------------|---------------------| | 3.4.x | 5.1.x 或更低 | | 3.5.0+ | 5.2.0+ | 2. **升级/降级依赖** ```xml <!-- 示例:适配 MyBatis 3.5.0+ 的 PageHelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.2</version> <!-- 必须 ≥5.2.0 --> </dependency> ``` 3. **验证插件拦截器签名** - 检查自定义插件或第三方插件的 `@Signature` 注解: ```java @Intercepts({ @Signature( type = ResultSetHandler.class, method = "handleResultSets", // 方法名必须与接口完全一致 args = {Statement.class} // MyBatis 3.5.x+ 中参数为 Statement ) }) ``` - ❗ **注意**:MyBatis 3.5.0 将参数从 `PreparedStatement` 改为 `Statement`[^3][^5]。 #### ️ 其他排查点 1. **依赖冲突检测** - 执行 `mvn dependency:tree` 检查是否存在多个 MyBatis 核心包冲突。 - 移除冗余依赖(如旧版的 `mybatis-3.2.8.jar` 与新版共存)。 2. **插件加载顺序** - 确保 `mybatis-config.xml` 中插件按正确顺序声明(分页插件应在其他插件前加载)。 3. **升级 MyBatis(可选)** - 若使用老旧插件(如 PageHelper ≤5.0.0),建议升级 MyBatis 到 3.5.x+: ```xml <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> <!-- 当前稳定版 --> </dependency> ``` #### 💡 总结流程 ```mermaid graph TD A[出现错误] --> B{检查MyBatis版本} B -->|3.4.x以下| C[升级MyBatis或降级插件] B -->|3.5.x+| D[升级插件到适配版本] C --> E[验证插件签名参数] D --> E E --> F[排除依赖冲突] F --> G[问题解决] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值