BindingException:Invalid bound statement (not found)异常

2023-05-16

一、前言

本文的mybatis是与springboot整合时出现的异常,若使用的不是基于springboot,解决思路也大体一样的。

二、从整合mybatis的三个步骤排查问题

但在这之前,我们先要知道整合mybatis的三个重要的工作,如此才能排查,且往下看。

2.1 pom.xml配置**Mapper.xml文件的构建路径

我们打开pom文件如下:

 <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <filtering>false</filtering>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <includes>
                    <include>*</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

这部分代码的作用是指定需要编译到taget目录下的资源文件。我们的程序运行,都是执行编译好的taget目录下的内容,若taget里找不到xml文件资源就会报错Invalid bound statement (not found)。

每个人的项目配置都可能有些区别,但在这里我们只需要关注<includes>标签即可。还有对于不同的项目,xml的存放位置也可能不同,有的存在于src/main/java代码下,有的存在于src/main/resources。

<include>**/*.xml</include>
这行代码是用于构建存在于src/main/java代码中的xml文件。

<include></include>
<include>**/
.xml</include>
这行代码是用于构建存在于src/main/resources代码中的所有文件。

上述,我们可以排查第一个可能抛出Invalid bound statement (not found)异常的情况,我们可以通过查看编译好的taget目录,如下:

情况一:

原代码文件目录:
在这里插入图片描述

编译失败的情况:
在这里插入图片描述

编译成功的情况:
在这里插入图片描述
情况二:
源代码文件目录:
在这里插入图片描述

编译失败:
在这里插入图片描述

编译成功:
在这里插入图片描述

有时,一直编译不成功,那就将taget重新删除,再编译。

2.2 配置mapper类的包扫描路径

这个步骤与Invalid bound statement (not found)异常无关,但是它也是整合mybatis重要的步骤之一,这里也说明一下,有两种方式实现,可根据自己的项目情况使用。(两者择其一)

通过注解的方式扫描:
在这里插入图片描述

通过配置类方式扫描:
在这里插入图片描述

这个步骤的目的是将我们定义的mapper类装配到我们的ioc容器中。

若没有扫描,启动时就会直接报找不到mapper的错误,无法运行项目。

2.3 application.yml文件中配置**Mapper.xml文件的扫描路径

这个配置若不正确,也会导致Invalid bound statement (not found)异常。值得一说的是,这一步骤的扫描是建立在步骤一的基础之上的,若编译好的taget目录都没有目标文件,那这一步骤就更不用说了。

一:

这里的扫描路径配置,还需要注意自己的项目使用的原始mybatis还是mybatis-plus,它们的配置也有区别的,如下:

原始mybatis:

mybatis:
  mapper-locations: classpath:/cn/anycase/demo/mapper/xml/*Mapper.xml

mybatis-plus:

mybatis-plus:
  mapper-locations: classpath:cn/anycase/demo/mapper/xml/*.xml

本例用的是mybatis-plus:
在这里插入图片描述

二:
使用mybatis-plus,当xml和mapper类在同级目录时可以省略这个扫描路径的配置,所以我们看到的有些项目少了这个配置(mybatis应该做了默认的扫描操作,这里不做深究),但它并没有错,且能正常运行。(原始mybatis是否也可以,本人未做相关测试)
在这里插入图片描述

三:
还有一个需要注意的点,前面步骤一说了,mapper.xml文件可能存在于src/main/java代码中,或存在于src/main/resources资源中,因此我们的配置路径也有所不同,如下:
在这里插入图片描述

Invalid bound statement (not found)这个异常,在常规下,通过上述的三个步骤可以百分百解决。

三、其他情况的Invalid bound statement (not found)异常

3.1 文件名导致的异常

在这里插入图片描述

在这里插入图片描述
上述截图的文件目录,在运行过程中也出现了Invalid bound statement (not found)异常,仔细检查了原代码xml、targe下的xml目录、yml中配置的扫描目录,看似正确了但其实是有问题的。

源代码目录的"mybatis.mapper"这个展示没问题,但target目录下的"mybatis.mapper"这个展示有问题,正常编译好的target文件目录都会是按层级展示的,但是这里确是连在了一起。所以发现问题了,就是在创建mybatis/mapper层级目录的时候,失误创建了名字为"mybatis.mapper"目录。

解决方案:删除mybatis.mapper,重新建立,先建mybatis文件夹,再建立mapper文件夹,最后再建立.xml文件。

3.2 因为扩展的配置类导致yml扫描路径配置不生效

这是另一种出现Invalid bound statement (not found)异常的情况,如下截图
在这里插入图片描述
如图所示,我们的各项步骤和配置都检查,仍旧不发现任何问题,但一当运行时就会报错,这很让人百思不得其解。。。。。但其实问题肯定是出在配置里头,是不是哪个地方出现了覆盖,导致扫描路径不生效?

有了这个想法,我们就可以检查源代码中的所有关于mybatis的配置类。最后,我们发现了一个类,如下:
在这里插入图片描述
源代码:

@Configuration
public class MybatisPlusConfig implements EnvironmentAware {

    Environment env;

    @Bean("primary")
    @Primary
    public DataSource dataSource() throws ClassNotFoundException {
        return DataSourceBuilder.create()
                .url(env.getProperty("spring.datasource.url"))
                .type((Class<? extends DataSource>) Class.forName(env.getProperty("spring.datasource.type")))
                .driverClassName(env.getProperty("spring.datasource.driverClassName"))
                .username(env.getProperty("spring.datasource.username"))
                .password(env.getProperty("spring.datasource.password"))
                .build();
    }

    @Bean("mainsf")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("primary") DataSource dataSource,
                                               GlobalConfiguration globalConfiguration) throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        configuration.setJdbcTypeForNull(JdbcType.NULL);
        configuration.setMapUnderscoreToCamelCase(true);
        sqlSessionFactory.setConfiguration(configuration);
        Interceptor[] plugins;
        plugins = new Interceptor[]{new PaginationInterceptor()};
        sqlSessionFactory.setPlugins(plugins);
        sqlSessionFactory.setGlobalConfig(globalConfiguration);
        return sqlSessionFactory.getObject();
    }

    @Bean
    public GlobalConfiguration globalConfiguration() {
        GlobalConfiguration conf = new GlobalConfiguration();
        conf.setIdType(1);
        return conf;
    }

    @Override
    public void setEnvironment(Environment environment) {
        this.env = environment;
    }
}

问题就发现了,这个配置类中自定义了一个SqlSessionFactory ,里边也配置了MybatisConfiguration相关的东西,因此我们yml里面的配置mybatis-plus. mapper-locations便失效了。

解决方案一:将这个配置类里相关的mybatis配置去掉。
解决方案二:将xml挪到mapper类的同级目录下。(因为默认会扫描mapper类的同级xml)

3.3 方法名和statement ID需要一致

这个错误是比较没水准,这里不做赘述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BindingException:Invalid bound statement (not found)异常 的相关文章

随机推荐

  • Android APK资源加载流程

    概述 我们在Activity中访问资源 xff08 图片 xff0c 字符串 xff0c 颜色等 xff09 是非常方便的 xff0c 只需要getResources 获取一个Resources对象 xff0c 然后就可以访问各种资源了 x
  • 倍福位置记忆--TwinCAT对绝对值编码器溢出圈数的处理--以汇川IS620N为例

    首先配置伺服 xff0c 如下所示 xff1a 根据伺服手册和编码器反馈的数值可知 xff0c 其每转脉冲数 xff0c 和最大的记忆圈数 xff1a 型号 xff1a IS620N 编码器位数 xff1a 8388608 最大 xff1a
  • 【LeetCode 】160. 相交链表(高频!字节面试题 双指针法 Python 7行代码 中学追及问题)

    1 题目描述 编写一个程序 xff0c 找到两个单链表相交的起始节点 如下面的两个链表 xff1a 在节点 c1 开始相交 示例 1 xff1a 输入 xff1a intersectVal span class token operator
  • Android中Paint字体的灵活使用

    在Android开发中 xff0c Paint是一个非常重要的绘图工具 xff0c 可以用于在控制台应用程序或Java GUI应用程序中绘制各种形状和图案 其中 xff0c Paint setText 方法是用于设置Paint绘制的文本内容
  • HTML5字体集合的实践经验

    随着互联网的发展 xff0c 网站已成为人们获取信息和交流的重要平台 而一个好的网站 xff0c 不仅需要有美观的界面 xff0c 还需要有良好的用户体验 其中 xff0c 字体是影响用户体验的一个重要因素 下面就让我们来看看HTML字体集
  • 20220806 美团笔试五道编程题(附AK题解)

    恭喜发现宝藏 xff01 微信搜索公众号 TechGuide 回复公司名 xff0c 解锁更多新鲜好文和互联网大厂的笔经面经 作者 64 TechGuide 全网同名 点赞再看 xff0c 养成习惯 xff0c 您动动手指对原创作者意义非凡
  • css中样式类型及属性值的获取

    前言 以前真的没怎么重视 xff0c 然后突然就遇到了与之相关的一个问题 xff0c 最后百度解决了这个问题 xff0c 因此简单记录一下 css样式类型 css样式主要分为三种类型 xff1a 1 内联样式 xff08 行内样式 xff0
  • Ubuntu 18.04版本设置root账户

    Linux系统下文件的权限十分重要 xff0c 大多数操作都需要一定的权限才可以操作 xff0c Ubuntu18 04默认安装是没有设置root账户的 xff0c 因此想要获得root账户登录可以使用以下步骤 xff1a 1 首先获得临时
  • Content-Type: application/vnd.ms-excel 操作文件

    如果要将查询结果导出到Excel xff0c 只需将页面的Context Type修改一下就可以了 xff1a header Content Type application vnd ms excel gt 如果希望能够提供那个打开 保存的
  • win7重装的坑:启动分区不存在 使用分区工具修正

    其实安装win7几个步骤 xff1a 制作启动硬盘 xff08 先制作启动盘 xff0c 再将下载好的ios镜像文件放入 xff09 使用一键安装工具安装系统修改引导启动项 原来的系统盘上面会有原来的主引导文件 xff08 MBR MSR格
  • IN和EXISTS的区别和使用

    一 结论 in 适合子表比主表数据小的情况 exists 适合子表比主表数据大的情况 当主表数据与子表数据一样大时 in与exists效率差不多 可任选一个使用 二 区别 2 1 in的性能分析 select from A where id
  • Android自定义ViewGroup交互进阶,右滑进入详情

    自定义Viewgroup右滑进入详情 前言 在之前的 ViewGroup 的事件相关一文中 xff0c 我们详细的讲解了一些常见的 ViewGroup 需要处理的事件与运动的方式 我们了解了如何处理拦截事件 xff0c 如何滚动 xff0c
  • spring事务实现的几种方式

    一 前言 1 事务几种实现方式 xff08 1 xff09 编程式事务管理对基于 POJO 的应用来说是唯一选择 我们需要在代码中调用beginTransaction commit rollback 等事务管理相关的方法 xff0c 这就是
  • Java实现通过正则表达式判断一个字符串是否含有指定字符

    场景 1 校验一个字符串是否包含有指定字符 这个很简单 xff0c 就单纯的用indexOf或者Contains方法实现就可以了 2 校验一个字符串是否包含的特殊字符 特殊字符虽有多个但也只有几个 xff0c 双重for循环套用indexO
  • springboot使用@SpringBootTest注解进行单元测试

    一 示例 1 1 添加依赖 span class token prolog lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt span span class token tag s
  • 比较两个List是否相等

    1 直接使用equals 比较 众所周知 xff0c 两个列表具有完全相同的元素并且具有完全相同的顺序时 xff0c 它们是相等的 因此 xff0c 如果我们业务要求两个list顺序一致 xff0c 可以使用equals xff08 xff
  • JVM-StringTable(三)

    一 常量池与串池StringTable的关系 span class token keyword public span span class token keyword class span span class token class n
  • SpringBoot常用拦截器(HandlerInterceptor,ClientHttpRequestInterceptor,RequestInterceptor)

    一 SpringBoot常用拦截器 下面3种拦截器 xff0c 都是http拦截器 xff0c 在处理业务逻辑之前对http请求信息进行处理 xff0c 比如获取请求头 xff0c 请求参数 xff0c 设置请求头 xff0c 请求参数等等
  • JAVA多线程基础篇-join方法的使用

    一 概述 join 是Thread类中的一个方法 xff0c 它的作用是将当前线程挂起 xff0c 等待其他线程结束后再执行当前线程 xff0c 即当前线程等待另一个调用join 方法的线程执行结束后再往下执行 通常用于在main主线程内
  • BindingException:Invalid bound statement (not found)异常

    一 前言 本文的mybatis是与springboot整合时出现的异常 xff0c 若使用的不是基于springboot xff0c 解决思路也大体一样的 二 从整合mybatis的三个步骤排查问题 但在这之前 xff0c 我们先要知道整合