mybatis綁定錯誤-- Invalid bound statement (not found)

mybatis綁定錯誤-- Invalid bound statement (not found)

 

1、問題描述

使用mybatis的項目在本地能夠正常運行,但當使用maven或Jenkins打包部署到遠程服務器上時出現了綁定錯誤,異常信息爲:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.yo.news.user.mapper.UserMapper.getUserByTelPwdjava

2、問題分析和解決方法

首先,給定的異常提示信息並不精準,有多個錯誤緣由都會拋出該異常。mybatis出現這個問題,一般是由Mapper interface和對應的xml文件的定義對應不上引發的,這時就須要仔細檢查對比包名、xml中的namespace、接口中的方法名稱等是否對應。我以前就由於稱忘記在xml標籤的id屬性中添加方法名或寫錯方法名而出現這個錯誤。spring

出現這個錯誤時,按如下步驟檢查通常就會解決問題:
1:檢查xml文件所在package名稱是否和Mapper interface所在的包名一一對應;
2:檢查xml的namespace是否和xml文件的package名稱一一對應;
3:檢查方法名稱是否對應;
4:去除xml文件中的中文註釋;
5:隨意在xml文件中加一個空格或者空行而後保存。sql

我在項目中遇到的問題可使用最後的解決方法解決:「隨意在xml文件中加一個空格或者空行而後保存」,看起來這麼怪異的解決方式,其實是觸發了IDE的自動編譯功能。因爲xml文件在編譯的時候,不必定總能當即從源目錄複製到class文件的編譯目錄(MyEclipse常常出這個問題),有時候你源目錄中的xml文件已經修改好了,而class所在的目錄裏面仍是舊的。所以真正肯定有效的方式是將正確的xml文件複製到class輸出目錄。apache

發現了問題就要從根本上解決,而不該該當出現了問題再去解決。我最後發現Jenkins經過maven把項目打成war包,或者Eclipse經過使用maven命令tomcat7:deploy遠程自動部署項目打成的war包,war包裏面缺乏Mapper對應的xml文件,也就是沒有把xml文件打包進去。解決辦法是,在pom.xml文件中的build標籤中添加以下代碼,顯示的強制將xml文件打到war包中:tomcat

<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> 
 
pom文件.png

還有種狀況會出這個錯誤,好比配置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文件更名便可。mybatis

 
做者:michael_wlq連接:https://www.jianshu.com/p/800fe918cc7a來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索