这个问题整整纠结了我四个多小时,心好累啊。。。不废话。。。html
背景:Spring整合Mybatisjava
报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)sql
解释:就是说,你的Mapper接口,被Spring注入后,却没法正常的使用mapper.xml的sql;apache
这里的Spring注入后的意思是,你的接口已经成功的被扫描到,可是当Spring尝试注入一个代理(MyBatista实现)的实现类后,却没法正常使用。这里的可能发生的状况有以下几种;app
- 接口已经被扫描到,可是代理对象没有找到,即便尝试注入,也是注入一个错误的对象(可能就是null)
- 接口已经被扫描到,代理对象找到了,也注入到接口上了,可是调用某个具体方法时,却没法使用(可能别的方法是正常的)
固然,咱们很差说是那种状况,毕竟报错的结果是同样的,这里就提供几种排查方法:maven
- mapper接口和mapper.xml是否在同一个包(package)下?名字是否同样(仅后缀不一样)?
- 好比,接口名是NameMapper.java;对应的xml就应该是NameMapper.xml
- mapper.xml的命名空间(namespace)是否跟mapper接口的包名一致?
- 好比,你接口的包名是com.abc.dao,接口名是NameMapper.java,那么你的mapper.xml的namespace应该是com.abc.dao.NameMapper
- 接口的方法名,与xml中的一条sql标签的id一致
- 好比,接口的方法List<User> findAll();那么,对应的xml里面必定有一条是<select id="findAll" resultMap="**">****</select>
- 若是接口中的返回值List集合(不知道其余集合也是),那么xml里面的配置,尽可能用resultMap(保证resultMap配置正确),不要用resultType
- 最后,若是你的项目是maven项目,请你在编译后,到接口所在目录看一看,颇有多是没有生产对应的xml文件,由于maven默认是不编译的,所以,你须要在你的pom.xml的<build></build>里面,加这么一段:
- <resources>
- <resource>
- <directory>src/main/java</directory>
- <includes>
- <include>**/*.xml</include>
- </includes>
- <filtering>true</filtering>
- </resource>
- </resources>
我就是坑在了第5点上,折腾了四个多小时,你们及时发现。ui