咕噜咕噜502 2021-06-03 14:02 采纳率: 57.7%
浏览 201
已结题

Invalid bound statement (not found): mapper层方法

我的权限模块登录时出错,报的却不是登录方法的错误,说mapper层方法无效绑定语句(未找到),求大佬帮忙看看

 

  • 写回答

1条回答 默认 最新

  • 小P聊技术 2021-06-03 14:19
    关注

    一、问题描述

    使用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都报绑定错误,很坑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月13日

悬赏问题

  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启