Invalid bound statement (not found)

这篇具有很好参考价值的文章主要介绍了Invalid bound statement (not found)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、遇到的问题

二、分析思路

1、映射文件

2、测试类

三、解决方案


一、遇到的问题

前几日,有个工作不久的同事找我帮他解决一个 Mybatis 的问题。他写了一个增删改查,但是在启动程序的时候报错:Invalid bound statement (not found) 。他试图解决该异常,花了一个小时还是没有解决,所以向我求助。所谓当局者迷,我帮他梳理了一下开发逻辑,几分钟后他发现了问题,并解决了该异常。刚工作两三年的开发者特别容易碰到该异常,但是只要理清思路,就很容解决问题。我将分析问题的思路记录一下,希望能帮到你。

二、分析思路

Mybatis 开发有两种方式,一种是原始 Dao 开发方式,另一种是 Mapper 动态代理开发方式。在开发项目时,我们会用 Mapper 动态代理开发方式,动态代理会自动帮我们生成 Mapper 的代理类,将细节封装起来。但是,在分析问题的时候,我们用原始 Dao 开发方式,可以让我们了解到 statement 绑定映射文件的细节。

下面使用原始 Dao 的开发方式演示一下 statement 是如何绑定映射文件中的 Sql 语句的。

1、映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.mapper.UserMapper">
        <!-- 查询所有的用户名 -->
    <select id="findUserNameList" resultType="java.lang.String">
        select user_name userName from user
    </select>
</mapper>

2、测试类

public class Test {

    //会话工厂
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void createSqlSessionFactory() throws IOException {
        // 配置文件
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);

    }

    // 查询所有的用户名
    @Test
    public void testFindUserNameById() {
        // 数据库会话实例
        SqlSession sqlSession = null;
        try {
            // 创建数据库会话实例sqlSession
            sqlSession = sqlSessionFactory.openSession();
            // 查询所有的用户名
            List<String> list = sqlSession.selectList("com.test.mapper.UserMapper.findUserNameById");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }

    }
}

在上面的测试中,使用了 sqlSession 的 selectList 方法,中间的参数就是 statement 。该参数用来确定映射文件中的 Sql 语句,换句话说就是用这个 statement 绑定映射文件中的 Sql 语句。

该参数是用映射文件中的 namespace 和 select 标签的 id 组合而成的,在项目是唯一的。示例中映射文件的 namespace 是:com.test.mapper.UserMapper,select 标签的 id 是:indUserNameById ,所以组合起来的 statement 是 com.test.mapper.UserMapper.findUserNameById

如果 statement 写错了,就会导致找不到映射文件中的 Sql 语句,就会报 Invalid bound statement (not found) 。所以造成该异常的原因是 statement 和 Sql 语句不匹配。

在实际项目会使用 Mapper 动态代理的开发方式,自动生成 mapper 接口的实现类,就更容易出现该异常了。

三、解决方案

既然知道了造成该异常的原因,就容易解决了,如果通过 statement 找不到映射文件中的 Sql 就会报错误:Invalid bound statement (not found) 。在项目中一般都是使用 Mapper 动态代理,所以我们要解决的也是动态代理的问题。先说一下 Mapper 动态代理的实现原理,看完之后你就知道应该怎么解决该异常了。

Mapper 动态代理只需要开发定义 Mapper 接口,Mybatis 会根据接口创建动态代理对象。使用该种方式开发,需要遵守一定的开发规范,规范如下 4 点:

  1. Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同。
  2. Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同
  3. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 Sql 的 parameterType 的类型相同
  4. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 Sql 的 resultType 的类型相同 

所以,我们在使用 Mapper 动态代理遇到该异常,就是要检查是否遵守开发规范,因为粗心或单词写错了,容易导致程序报错。

我列了几个检查步骤,你跟着步骤检查一下,肯定能找到问题的所在之处。步骤如下 7 点:

  1. 检查 target 目录中有没有 Mybatis 的映射文件
  2. 检查 mybatis.mapper-locations 配置,该配置是把 mapper 的位置告诉 Mybatis 。默认是mapper-locations: classpath*:/mapper/**/*.xml
  3. 检查映射文件是不是放在 resources/mapper 目录中
  4. 检查映射文件中的 namespace 与 mapper 接口的类路径是不是一样
  5. 检查映射文件中的 statement 是不是和 Mapper 接口的方法名一样
  6. 检查映射文件中的 statement 的 parameterType 和 resultType 是不是和 Mapper 接口的方法中的入参和出参一样
  7. 如果你使用 Idea 开发,检查一下 resources 目录,在该目录下创建下级目录是不能一次性创建的,要创建完成一个目录后再创建另外的下级目录

另外,如果你遇到过该异常,并且遇到的错误不在上述之中。不妨在留言区提出,大家一起讨论一下,给后来者提个醒,避免遇到坑。文章来源地址https://www.toymoban.com/news/detail-428608.html

到了这里,关于Invalid bound statement (not found)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Invalid bound statement (not found)的原因以及解决方法

    相信我们在学习Mybatis的时候都出现过 Invalid bound statement (not found) 这个错误,一般由以下几种可能导致这个错误 例如: mapper:  对应的mapper.xml 这里建议小伙伴们下载一个插件,方便查看你的xml是否对应了你想对应的mapper接口 有了这个插件,你的接口mapper和对应的mapper.xml都

    2024年02月15日
    浏览(42)
  • mybatis plus报错:Invalid bound statement (not found)

    有的同学,在搭建mybatis plus项目时,遇到Invalid bound statement (not found)的问题,实质上是mapper接口和mapper.xml没有映射起来。 这种情况,常见的问题有以下几个: 1、mapper.xml 里面的 namespace与实际的mapper类路径不一致。 这个有个快捷的检测办法就是按住ctrl键,然后点击namespace里

    2024年02月04日
    浏览(47)
  • Invalid bound statement (not found)出现原因和解决方法

    出现的原因:mapper接口和mapper.xml文件没有映射起来。 解决方法: 1、 .mapper.xml中的namespace和实际的mapper文件是否一致 2、 检查mapper接口中的方法名与mapper.xml文件中的id是否一致 推荐大家去下载MyBatisX插件,可以自动实现mapper接口到mapper.xml之间的映射,既能提高效率,又能避

    2024年02月11日
    浏览(55)
  • Invalid bound statement (not found):常见报错原因解决

    在SpringMVC项目中,通过mapper接口加载映射文件,完成数据库的操作。 报错:Invalid bound statement (not found): 1、xml文件的namespace不正确 2、XxxMapper.java的方法在XxxMapper.xml中没有,运行则会报此错误 3、XxxMapper.java的方法返回值是List,但是没有正确配置ResultMap,或者只配置ResultType 4、

    2023年04月27日
    浏览(39)
  • Mybatis异常Invalid bound statement (not found)原因之Mapper文件配置不匹配

    模拟登录操作 网页提示服务器代码错误 后端显示无法找到Mapper中对应的方法 原因 相信我们在学习Mybatis的时候都出现过 Invalid bound statement (not found) 这个错误, 一般由以下几种可能导致这个错误 第一种:mapper.xml中的namespace和实际的mapper文件不一致 第二种:mapper.xml中的id名与

    2024年02月14日
    浏览(39)
  • myBatis plus 调用基本方法(insert update.... ) Invalid bound statement (not found)

    直接调用BaseMapper 或者 是Iservice 里面的方法报如下错,大概率是依赖版本冲突 我的依赖版本如下,解决了这个问题 “org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)” 错误通常表示在 MyBatis 中找不到有效的绑定语句。 这个错误可能有以下几个可能的原因: SQL

    2024年02月13日
    浏览(55)
  • 【报错解决】org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

     对于这种错误,一般在于mapper接口与xml文件无法绑定。 解决方案: 1.检查xml文件名是否与mapper接口名一致。 2.检查xml文件中namespace是否与mapper接口的全类名一致。(按住ctrl点击能跳转就没问题) 3.是否在主启动类上标注了@MapperScan(“mapper接口所在包的全包名”)或在map

    2024年02月15日
    浏览(67)
  • org.apache.ibatis.binding.BindingException:Invalid bound statement (not found)绑定异常出现原因和解决方法

    绑定异常,(其实出现这个问题实质就是mapper接口和mapper.xml文件没有映射起来。) 异常提示信息如下: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) :cn.tedu.csmall.server.mapper.BrandMapper.insert 写XML文件时一定要注意注意再注意, 因为报错提示会指定到XML中 出现此异常

    2024年02月06日
    浏览(40)
  • Junit启动测试mybatis xml文件BindingException: Invalid bound statement问题

    背景:1、正常启动,xml文件放在java目录和resource目录下均正常 2、junit启动,xml文件放在resource目录下正常,放在 java目录下 报BindingException错误 mapperlocation绑定地址为:\\\"classpath:com/a/b/**/*.xml\\\"   原因就在于绑定的地址有问题。   junit生成的test-classes下的测试类test所在目录与c

    2023年04月20日
    浏览(58)
  • Stata17安装后遇到Java installation not found问题解决方法

    初次使用 Stata17的时候你可能会遇到这个问题,在执行ssc install aaplot命令的时候,会报报错: Java installation not found ,这是因为没有指定Java环境导致的,我们只需要在stata中指定一下Java的环境变量就可以解决。 1、下载java17以上的版本: https://www.oracle.com/java/technologies/javase/

    2024年02月11日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包