我的報錯信息是:
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個會發生該異常的情況
- mappedStatements爲{} (跟蹤debug發現,我出現這裏爲空)
- 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加載配置文件,完美解決遇到的問題了。