美文网首页JAVA扩展技术未分类
mybatis绑定错误-- Invalid bound stat

mybatis绑定错误-- Invalid bound stat

作者: michael_wlq | 来源:发表于2016-07-13 18:47 被阅读62602次

    一、问题描述

    使用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文件中加一个空格或者空行然后保存。

    我在项目中遇到的问题可以使用最后的解决方法解决:“随意在xml文件中加一个空格或者空行然后保存”,看起来这么怪异的解决方式,实际上是触发了IDE的自动编译功能。由于xml文件在编译的时候,不一定总能立即从源目录复制到class文件的编译目录(MyEclipse经常出这个问题),有时候你源目录中的xml文件已经修改好了,而class所在的目录里面还是旧的。因此真正确定有效的方式是将正确的xml文件复制到class输出目录。

    发现了问题就要从根本上解决,而不应该当出现了问题再去解决。我最后发现Jenkins通过maven把项目打成war包,或者Eclipse通过使用maven命令tomcat7:deploy远程自动部署项目打成的war包,war包里面缺少Mapper对应的xml文件,也就是没有把xml文件打包进去。解决办法是,在pom.xml文件中的build标签中添加如下代码,显示的强制将xml文件打到war包中:

    <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文件改名即可。

    相关文章

      网友评论

      • Tommie_28c7:遇到一样的问题, 跟了半天源码才发现是资源文件的问题, 之前Spring + mybatis的时候掉坑里一次, 这次换SpringBoot整合MyBatis又掉进去一次 = = ||
      • 0b092e4afe5b:我半信半疑的按照你的方法做,居然成功了,很激动:joy_cat:
      • Dr_Jaguar:我是
        @MapperScan("com.xxx.smsreczj.dao")
        这里没设置正确,也会出现这个问题。
      • c94f1fe27856:谢谢大哥的 分享 谢谢
      • alonwang:多谢,看了你的才想起来是资源文件拷贝的问题
      • eaa2748e753c:遇到一个mybatis的 Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]的问题,奇怪的是,在ide中完全没错,执行正常。而以服务的方式进行时,却报这个错误。后来通过将多个参数换成一个对象解决了。但是这种问题也太奇怪了。
        eaa2748e753c:这个问题后来解决了,原因在于IDE中使用的是JDK7环境,运行过程中使用的是JDK8。mybatis针对jdk8 已经不支持此功能了。
        Me1rfa丶:这个错误可以通过在Mapper接口方法的参数上添加@Param("")注解来手动标注你的属性名.
      • 54e45929e45e:多谢老哥,我也是出了这个错,然后我按照你的怪异的方法。。。特么的成功了!

      本文标题:mybatis绑定错误-- Invalid bound stat

      本文链接:https://www.haomeiwen.com/subject/gbvsjttx.html