看了网上很多解决方法发现并不全,大部分都是检查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等方式。
当然,打断点进源码查看才是最简单最快捷的方式
当遇到MyBatis报错找不到对应的mappedstatement时,即使namespace和id都确认无误,问题可能在于mapper文件未被正确扫描。通过检查configuration对象中是否包含mapper,发现mapper文件确实未被加载。解决方案是在配置文件中确保添加了mapper资源的扫描路径,以确保mapper.xml能被正确解析并绑定到MappedStatement。如果依然无法解决,建议深入源码进行调试。
2568

被折叠的 条评论
为什么被折叠?



