从源码角度解决mybatis报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

当遇到MyBatis报错找不到对应的mappedstatement时,即使namespace和id都确认无误,问题可能在于mapper文件未被正确扫描。通过检查configuration对象中是否包含mapper,发现mapper文件确实未被加载。解决方案是在配置文件中确保添加了mapper资源的扫描路径,以确保mapper.xml能被正确解析并绑定到MappedStatement。如果依然无法解决,建议深入源码进行调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了网上很多解决方法发现并不全,大部分都是检查namespace和标签id是否正确以及是否和方法名对应。首先要说一下报错中的这个statement 就是mappedstatement,在mybatis中一个mappedstatement对应一个或者是其他标签,是一对一的关系。如果检查了namespace和xml配置发现都没问题,就可以怀疑是自己的mapper文件并没有被扫描到。下面是我的排错思路:
在这里插入图片描述
实际上这两个都是正确的。但还是会报异常:
在这里插入图片描述
========================================================================分割线

很多人可能会遇到我这种情况,明明namespace和id都对的上,就是找不到错在哪?别着急,我们从源码来看:首先要知道mybatis的所有执行操作都交给了sqlsession,那么我们可以看一下sqlsession执行的时候是否找到了对应的statement(namespace+selectId)
在这里插入图片描述

按照上面的思路,我们可以尝试看看这个configuration.getMappedStatement方法能否获取到我们的mapper。我试了一下发现并没有,返回换个方法查看所有的mapper,并不存在相关或类似的。说明我们的mapper文件压根就没有被扫描到,导致我们自定义的mapperStatement匹配不上。
在这里插入图片描述
到这里应该知道大概原因了,就是mapper.xml没有被扫描到。于是到配置文件中加上扫描路径匹配就好了在这里插入图片描述

如果出现mapper绑定失败,且namespace和id都没错。可以检查一下configuration中匹配mapper文件的方式,比如classPath,resource等方式。

当然,打断点进源码查看才是最简单最快捷的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值