1. 程式人生 > >[SSM]Mybatis繫結錯誤的原因

[SSM]Mybatis繫結錯誤的原因

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

一般的原因是Mapper interface和xml檔案的定義對應不上,需要檢查包名,namespace,函式名稱等能否對應上,需要比較細緻的對比,我經常就是寫錯了一兩個字母搞的很長時間找不到錯誤

按以下步驟一一執行:
1:檢查xml檔案所在的package名稱是否和interface對應的package名稱一一對應
2:檢查xml檔案的namespace是否和xml檔案的package名稱一一對應
3:檢查函式名稱能否對應上
4:去掉xml檔案中的中文註釋
5:隨意在xml檔案中加一個空格或者空行然後儲存

一般來說到此就可以排除錯誤了。

以上步驟除第5步,其他步驟沒什麼問題。第5步看起來這麼怪異的解決方式,實際上是觸發了ide的自動編譯功能。由於xml檔案在編譯的時候,不一定總能立即從源目錄複製到class檔案的編譯目錄(MyEclipse經常出這個問題),有時候你源目錄中的xml檔案已經修改好了,而class所在的目錄裡面還是舊的。因此真正確定有效的方式是將正確的xml檔案複製到class輸出目錄。

還有種情況會出這個錯誤,比如配置xml對映檔案需要滿足特定要求

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource" p:configLocation="classpath:mybatis-config.xml"> <property name="mapperLocations"> <list> <value>classpath*:mapper/com/xxx/**/*Mapper.xml</value> <value>classpath*:dao/com/xxx/**/
*Mapper.xml</value> </list> </property> </bean>

如上只有Mapper結尾的xml檔案才會被Mybatis掃描到,這個時候如果忘記了這個規則,xml使用了其他名稱,如xxxDao.xml。這樣xml的配置就不會加入到Mybatis儲存配置的一個map物件裡去,也會出現 Invalid bound statement 的錯誤。解決方法就是把xml檔案改名即可。

比如我拿來練手的第一個ssm專案,一直顯示“org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)”
結果查了半天果然是在UserMapper.xml中將namespace裡的com.shawn.dao.IUserDao少寫了個dao…

引以為戒。