解決Invalid bound statement (not found)(Mybatis的Mapper綁定問題)

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屬性中添加方法名或寫錯方法名而出現這個錯誤。apache

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

 

--------------------------------mybatis

可是!!!!!!最後發現問題所在:maven項目的約定配置文件必須放resources裏,src目錄下的xml文件默認不會編譯到target。因爲我把mapper.xml放在了src目錄裏,才致使了錯誤的發生,該問題的實質是,idea對classpath的規定。在eclipse中,把資源文件放在src文件夾下,是能夠找到的;可是在idea中,直接把資源文件放在src文件夾下,若是不進行設置,是不能被找到的。

原來Maven 爲咱們提供了一致的項目目錄配置(源文件夾、資源文件夾等),在自動構建項目時, Maven 會按照這個配置來執行操做(編譯源文件、拷貝資源文件),Maven 默認的源文件夾及資源文件夾的配置代碼以下:
<build>  
   <sourceDirectory>src/main/java</sourceDirectory >  
   <testSourceDirectory>src/test/java</testSourceDirectory >  
   <resources>  
       <resource>  
          <directory>src/main/resources</directory>  
       </resource>  
   </resources>  
   <testResources>  
       <testResource>  
          <directory>src/test/resources</directory>  
       </testResource>  
   </testResources>  
</build>

解決方案有2種:app

一、能夠把xml文件放到resource目錄下,這樣項目構建的時候會加載到target。eclipse

二、在pom.xml文件build添加resource資源列表。maven

<!--這個元素描述了項目相關的全部資源路徑列表,例如和項目相關的屬性文件,這些資源被包含在最終的打包文件裏。-->
<resources>
    <resource>
        <!-- 描述存放資源的目錄,該路徑相對POM路徑-->
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
    </resource>
</resources>

總結ide

若是出現org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)錯誤,通常的緣由是Mapper interface和xml文件的定義對應不上,須要檢查包名,namespace,函數名稱等可否對應上,須要比較細緻的對比,按如下步驟一一執行:函數

一、檢查xml文件所在的package名稱是否和interface對應的package名稱一一對應ui

二、檢查xml文件的namespace是否和xml文件的package名稱一一對應

三、檢查函數名稱可否對應上

四、去掉xml文件中的中文註釋

五、隨意在xml文件中加一個空格或者空行而後保存

除此以外,我遇到的還有一些特殊狀況,耽誤了我很多時間,網上有其餘緣由也致使bound找不到:

一、Intellij Idea 的包名和目錄名生成機制,新建一個包a.b.c.d,目錄結構不是a->b->c->d,而是生成"a.b.c.d"的目錄,進而致使mybatis映射錯誤,此錯誤很難排查。

二、xml文件定義以下:

<select id="countMembers" parameterMap="java.util.Map" resultType="java.lang.Integer">

parameterMap用錯,應該爲parameterType,此錯誤會致使mybatis全部的mapper都報綁定錯誤,很坑。

相關文章
相關標籤/搜索