這個問題整整糾結了我四個多小時,心好累啊。。。不廢話。。。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