1. 程式人生 > >org.apache.ibatis.binding.BindingException【原因彙總】

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
    <resources>  
        <resource>  
            <directory>src/main/java</directory>  
            <includes>  
                <include>**/*.xml</include>  
            </includes>  
            <filtering>true</filtering>  
        </resource>  
    </resources>

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

業務需求變更永無休止,技術前進就永無止境!