看了网上很多解决方法发现并不全,大部分都是检查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等方式。
当然,打断点进源码查看才是最简单最快捷的方式