错误描述
问题描述:学习 Spring 和 Mybatis 进行整合时,出现
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): ...
开发工具:IDEA
解决方案
出现上述问题,一般原因是 xm l 映射文件有错误,也就是说 Mapper interface 和 其相关的 xml 文件的定义对应不上。
我们按以下步骤一一执行,尝试解决:
- 检查 xml 文件所在的 package 名称是否和 interface 对应的 package 名称一一对应
- 检查 xml 文件的 namespace 是否和 xml 文件的 package 名称一一对应
- 检查函数名称能否对应上
- 去掉 xml 文件中的中文注释
- 随意在 xml 文件中加一个空格或者空行然后保存(触发了 ide 的自动编译功能。由于 xml 文件在编译的时候,不一定总能立即从源目录复制到 class 文件的编译目录( MyEclipse 经常出这个问题),有时候你源目录中的 xml 文件已经修改好了,而class所在的目录里面还是旧的。因此真正确定有效的方式是将正确的 xml 文件复制到 class 输出目录。)
但是我按照上述方式并没有解决问题,表示很奇怪,经过上网查询,直至看到 IDEA异常解决: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) ,问题才得以解决,在这里向该博主表示感谢!
查看了发布之后的源代码之后,发现 *Mapper.xml 文件并没有发布到目标文件中
错误原因终于找到了,就是 xml 文件在发布时不会编译,同时也不会发布到 target 中,导致项目运行时找不到 mapper.xml 文件。
解决方案:
第一步:将 *Mapper.xml 文件提取到指定文件夹 mapper 中,设置 mapper 文件夹类型为 resource
第二步:在 spring-mybatis.xml 配置文件中添加红色框中的代码对 mapper 文件进行扫描.
第三步:重新编译执行,问题解决,target 文件夹下面出现 *Mapper.xml 文件
总结
eclipse 和 myeclipse 中 mapper.java 和 mapper.xml 在同一目录下,直接配置扫描不会出现上述问题,但是使用编辑器 IDEA 会出现该问题,需要将 mapper.xml 文件指定为 resources 。