解決org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)錯誤

我的報錯信息是:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.study.server.mapper.UserMapper.insert
    at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:227)
    at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:49)
    at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)
    at com.sun.proxy.$Proxy88.insert(Unknown Source)

分析

通過跟蹤mybatis的源碼,發現有兩種binding途徑,一是配置文件,二是註解。項目中我用的是配置文件,關鍵代碼如下:

public boolean hasStatement(String statementName, boolean validateIncompleteStatements) {
    if (validateIncompleteStatements) {
      buildAllStatements();
    }
    return mappedStatements.containsKey(statementName);
}

可以看出有2個會發生該異常的情況

  1. mappedStatements爲{} (跟蹤debug發現,我出現這裏爲空)
  2. containsKey(statementName),沒有找到

mappedStatements爲空的原因是由於在spring容器啓動時,會解析spring配置文件,這時將去加載資源文件,解析並以key,value的形式緩存在mappedStatements中。而在實際情況下,發現打包時*Mapper.xml並沒有自動複製到class輸出目錄的mapper類包下。從而導致mappedStatements爲空。

網上總結的一般原因
Mapper interface和xml文件的定義對應不上,需要檢查包名,namespace,函數名稱等能否對應上。
按以下步驟一一執行:
1、檢查xml文件所在的package名稱是否和interface對應的package名稱一一對應
2、檢查xml文件的namespace是否和xml文件的package名稱一一對應
3、檢查函數名稱能否對應上
4、去掉xml文件中的中文註釋
5、隨意在xml文件中加一個空格或者空行然後保存
項目中的解決方法:
在使用IDEA開發時,如果打包時*Mapper.xml沒有自動複製到class輸出目錄的mapper類包下,則需要在pom文件中添加mybatis加載配置文件的配置!
如下:

<build>
  <resources>
    <resource>
        <directory>src/main/java</directory>
      <includes>
        <include>**/*.xml</include>
      </includes>
    </resource>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
</build>

通過在pom文件中添加mybatis加載配置文件,完美解決遇到的問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章