org.apache.ibatis.binding.BindingException【緣由彙總】

這個問題整整糾結了我四個多小時,心好累啊。。。不廢話。。。html

背景:Spring整合Mybatisjava

報錯:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)sql

解釋:就是說,你的Mapper接口,被Spring注入後,卻沒法正常的使用mapper.xml的sql;apache

       這裏的Spring注入後的意思是,你的接口已經成功的被掃描到,可是當Spring嘗試注入一個代理(MyBatista實現)的實現類後,卻沒法正常使用。這裏的可能發生的狀況有以下幾種;app

  1. 接口已經被掃描到,可是代理對象沒有找到,即便嘗試注入,也是注入一個錯誤的對象(可能就是null)
  2. 接口已經被掃描到,代理對象找到了,也注入到接口上了,可是調用某個具體方法時,卻沒法使用(可能別的方法是正常的)

固然,咱們很差說是那種狀況,畢竟報錯的結果是同樣的,這裏就提供幾種排查方法:maven

  1. mapper接口和mapper.xml是否在同一個包(package)下?名字是否同樣(僅後綴不一樣)?
    [plain]  view plain  copy
     
    1. 好比,接口名是NameMapper.java;對應的xml就應該是NameMapper.xml  
  2. mapper.xml的命名空間(namespace)是否跟mapper接口的包名一致?
    [plain]  view plain  copy
     
    1. 好比,你接口的包名是com.abc.dao,接口名是NameMapper.java,那麼你的mapper.xml的namespace應該是com.abc.dao.NameMapper  
  3. 接口的方法名,與xml中的一條sql標籤的id一致
    [html]  view plain  copy
     
    1. 好比,接口的方法List<User> findAll();那麼,對應的xml裏面必定有一條是<select id="findAll" resultMap="**">****</select>  
  4. 若是接口中的返回值List集合(不知道其餘集合也是),那麼xml裏面的配置,儘可能用resultMap(保證resultMap配置正確),不要用resultType
  5. 最後,若是你的項目是maven項目,請你在編譯後,到接口所在目錄看一看,頗有多是沒有生產對應的xml文件,由於maven默認是不編譯的,所以,你須要在你的pom.xml的<build></build>裏面,加這麼一段:
    [html]  view plain  copy
     
    1. <resources>  
    2.     <resource>  
    3.         <directory>src/main/java</directory>  
    4.         <includes>  
    5.             <include>**/*.xml</include>  
    6.         </includes>  
    7.         <filtering>true</filtering>  
    8.     </resource>  
    9. </resources>  

我就是坑在了第5點上,折騰了四個多小時,你們及時發現。ui

相關文章
相關標籤/搜索