zoukankan      html  css  js  c++  java
  • 解决Invalid bound statement (not found)(Mybatis的Mapper绑定问题)

    一、问题描述

    使用mybatis的项目在本地可以正常运行,但当使用maven或Jenkins打包部署到服务器上时出现了绑定错误,异常信息为:
    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.yo.news.user.mapper.UserMapper.getUserByTelPwd

    二、问题分析和解决方法

    首先,给定的异常提示信息并不精准,有多个错误原因都会抛出该异常。mybatis出现这个问题,通常是由Mapper interface和对应的xml文件的定义对应不上引起的,这时就需要仔细检查对比包名、xml中的namespace、接口中的方法名称等是否对应。我之前就因为称忘记在xml标签的id属性中添加方法名或写错方法名而出现这个错误。

    出现这个错误时,按以下步骤检查一般就会解决问题:
    1:检查xml文件所在package名称是否和Mapper interface所在的包名一一对应;
    2:检查xml的namespace是否和xml文件的package名称一一对应;
    3:检查方法名称是否对应;
    4:去除xml文件中的中文注释;
    5:随意在xml文件中加一个空格或者空行然后保存。

    --------------------------------

    但是!!!!!!最后发现问题所在: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种:

    1、可以把xml文件放到resource目录下,这样项目构建的时候会加载到target。

    2、在pom.xml文件build添加resource资源列表。

    <!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。-->
    <resources>
        <resource>
            <!--   描述存放资源的目录,该路径相对POM路径-->
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>

    总结

    如果出现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文件中加一个空格或者空行然后保存

    除此之外,我遇到的还有一些特殊情况,耽误了我不少时间,网上有其他原因也导致bound找不到:

    1、Intellij Idea 的包名和目录名生成机制,新建一个包a.b.c.d,目录结构不是a->b->c->d,而是生成"a.b.c.d"的目录,进而导致mybatis映射错误,此错误很难排查。

    2、xml文件定义如下:

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

    parameterMap用错,应该为parameterType,此错误会导致mybatis所有的mapper都报绑定错误,很坑。

     
  • 相关阅读:
    2018 ACM 网络选拔赛 徐州赛区
    2018 ACM 网络选拔赛 焦作赛区
    2018 ACM 网络选拔赛 沈阳赛区
    poj 2289 网络流 and 二分查找
    poj 2446 二分图最大匹配
    poj 1469 二分图最大匹配
    poj 3249 拓扑排序 and 动态规划
    poj 3687 拓扑排序
    poj 2585 拓扑排序
    poj 1094 拓扑排序
  • 原文地址:https://www.cnblogs.com/itzyz/p/10954427.html
Copyright © 2011-2022 走看看