MyBatis异常处理org.apache.ibatis.executor.ExecutorException

本文探讨了在使用MyBatis框架进行数据库操作时遇到的一个常见异常:查询返回多条记录而非预期的单一记录。文章详细分析了异常产生的原因,并提供了解决方案。

由于测试缘故,数据库被加入了很多测试数据。再次执行原来的查询出现了异常org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Statement returned more than one row, where no more than one was expected.

通过描述可以看到,期待返回结果数应该小于等于1,但却返回多条记录。开始由于查询返回的对象是A,检查了一下A发现没有重复记录,随后发现A类内部有成员B。

class A{
    B b;
}

而在Mapper中的定义的Sql中查询b是返回唯一的结果,而不是一个List。因此是在查询b的时候造出现了异常。最后清理掉数据,异常解决。 所以当遇到这种异常时候不但要关注查询返回结果时候唯一,还要注意所查询的结果中包含的成员对象是否允许有多个。

org.apache.ibatis.executor.ExecutorException异常可能由以下几种原因产生,对应的解决办法如下: ### 原因一:查询结果行数不符合预期 当执行查询时,预期结果不超过一行,但实际返回了多行数据,会抛出 `org.mybatis.spring.MyBatisSystemException` 嵌套 `org.apache.ibatis.executor.ExecutorException` 异常,错误信息为 `Statement returned more than one row, where no more than one was expected`。例如由于测试加入大量数据后,再次执行原查询就可能出现此问题 [^1]。 **解决办法**:检查查询语句,确保查询条件能精确筛选出符合预期数量的结果。若确实需要处理多行结果,可修改代码逻辑以接收和处理多行数据。 ### 原因二:实体类构造方法不匹配 MyBatis 在运行过程中要调用实体类中的构造方法,若找不到匹配的构造方法,会抛出 `org.apache.ibatis.executor.ExecutorException` 异常,错误信息如 `No constructor found in com.xd.entity.Users matching [...]` [^2]。 **解决办法**:在实体类中添加一个空参构造方法。 ### 原因三:SqlSession 提前关闭 在使用 MyBatis 框架时,若将 SqlSession 初始化为全局对象或 static 对象,一旦有地方关闭了该 SqlSession,后续再使用就会导致 `org.apache.ibatis.executor.ExecutorException` 异常,错误信息为 `Executor was closed` [^3]。若使用静态代码块,代码只在类加载时执行一次,调用方法后关闭了 SqlSession,后续再次调用时,由于不会创建新的 SqlSession,也会报此错误 [^4]。 **解决办法**:避免将 SqlSession 初始化为全局对象或 static 对象。在每次需要执行数据库操作时,新创建一个 SqlSession,并在使用完后及时关闭。示例代码如下: ```java try (SqlSession sqlSession = sqlSessionFactory.openSession()) { // 执行数据库操作 // ... sqlSession.commit(); // 如果有更新操作,需要提交事务 } catch (Exception e) { e.printStackTrace(); } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值