這個問題整整糾結了我四個多小時,心好累啊。。。不廢話。。。
背景:Spring整合Mybatis
報錯:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
解釋:就是說,你的Mapper接口,被Spring注入后,卻無法正常的使用mapper.xml的sql;
這里的Spring注入后的意思是,你的接口已經成功的被掃描到,但是當Spring嘗試注入一個代理(MyBatista實現)的實現類后,卻無法正常使用。這里的可能發生的情況有如下幾種;
- 接口已經被掃描到,但是代理對象沒有找到,即使嘗試注入,也是注入一個錯誤的對象(可能就是null)
- 接口已經被掃描到,代理對象找到了,也注入到接口上了,但是調用某個具體方法時,卻無法使用(可能別的方法是正常的)
當然,我們不好說是那種情況,畢竟報錯的結果是一樣的,這里就提供幾種排查方法:
- 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點上,折騰了四個多小時,大家及時發現。