org.apache.ibatis.binding.BindingException【原因匯總】


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

背景:Spring整合Mybatis

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

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

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

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

當然,我們不好說是那種情況,畢竟報錯的結果是一樣的,這里就提供幾種排查方法:

  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點上,折騰了四個多小時,大家及時發現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM