mybatis绑定错误-- Invalid bound statement (nMot found)
这两天在弄一个项目 项目中使用了 Spring Boot + Mybatis-Plus 等一些框架,用Mybatis-Plus 代替Mybatis代码比起之前的Mybatis减少了很多,xml 文件都没有了,但由于项目中有些业务的需求需要一些复杂的点的SQL。然后又添加了几个xml文件,自定义了SQL。 (用Mybatis-Plus 有好处也有头疼的地方,这里就不多说了)
就这几个xml,搞死我了。发布到服务器上的时候当有地方调用这几个SQL的时候,就会出现下面出错
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)## 标题:
问题排查
检查了各地方配置文件,网上也查了以下方法都试过:
- 检查xml文件所在package名称是否和Mapper interface所在的包名一一对应;
- 检查xml的namespace是否和xml文件的package名称一一对应;
- 检查方法名称是否对应;
- 去除xml文件中的中文注释;
- 随意在xml文件中加一个空格或者空行然后保存。
我刚开始怀疑是环境问题,检查了jdk版本发现都一样的,还有会不会是打包的问题,我们是用jenkis部署的我从本地打包也同样有这样的问题。
使用IDEA工具 的需要注意这个问题:
由于新版的IntelliJ IDEA不再编译source folder下的xml文件,而我们平时使用mybatis时,习惯于将*Mapper.xml文件放在与dao层、service层平级的src目录下。这就导致ItelliJ IDEA不会变异这些xml文件夹,从而导致Invalid bound statement (not found)的发生。
解决方法如下:
1、将*Mapper.xml文件夹放在resource文件夹下,但是这种方式会打破原来的代码结构,如果团队中有人用eclipse有人用IntelliJ,这样就比较麻烦了;
2、在maven项目的pom.xml中build标签下插入:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
手工将src下所有xml文件引入编译;
按以上步骤检查都没有解决问题,让我很奔溃,最郁闷的是在本地启动时是没有问题的,没有出现任何问题,一发布到服务器测试环境就出现这种情况。
最后无奈去官网看了看 Mybatis-Plus 自定义 SQL 无法执行 的常见问题
将里面 出现 Invalid bound statement (not found) 异常 的原因都对了一遍 ,发现了一个地方没有对上
官网实例如下:
而我的配置文件是这样的 (项目中使用的是.properties不是yml,格式不大一样,但意思一样的):
我红色框框里面 classpath*:mybatis/Mapper.xml 这个跟官网的少了个 * ,
我把它改成classpath:mybatis/*Mapper.xml ,赶紧发布到测试环境,因为这个问题我已经忙活很久了
居然成功解决了我的天!!!
最后配置文件如下:
我当时在想我怎么一开始就不来官网看看呢,就很纳闷。
最终让我很郁闷的是 为什么本地之前那么写就没有问题呢??
还有一点就是这个项目的配置文件是从其他地方copy 过来的,当时就改了改一些参数值
本地运行一切都正常,所以没在意这里。