BindingException:Invalid bound statement (not found)异常

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

一、前言

本文的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目录,如下:

情况一:

原代码文件目录:
invalid bound statement(not found),笔记,mybatis,java,spring boot

编译失败的情况:
invalid bound statement(not found),笔记,mybatis,java,spring boot

编译成功的情况:
invalid bound statement(not found),笔记,mybatis,java,spring boot
情况二:
源代码文件目录:
invalid bound statement(not found),笔记,mybatis,java,spring boot

编译失败:
invalid bound statement(not found),笔记,mybatis,java,spring boot

编译成功:
invalid bound statement(not found),笔记,mybatis,java,spring boot

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

2.2 配置mapper类的包扫描路径

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

通过注解的方式扫描:
invalid bound statement(not found),笔记,mybatis,java,spring boot

通过配置类方式扫描:
invalid bound statement(not found),笔记,mybatis,java,spring boot

这个步骤的目的是将我们定义的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:
invalid bound statement(not found),笔记,mybatis,java,spring boot

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

三:
还有一个需要注意的点,前面步骤一说了,mapper.xml文件可能存在于src/main/java代码中,或存在于src/main/resources资源中,因此我们的配置路径也有所不同,如下:
invalid bound statement(not found),笔记,mybatis,java,spring boot

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

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

3.1 文件名导致的异常

invalid bound statement(not found),笔记,mybatis,java,spring boot

invalid bound statement(not found),笔记,mybatis,java,spring boot
上述截图的文件目录,在运行过程中也出现了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)异常的情况,如下截图
invalid bound statement(not found),笔记,mybatis,java,spring boot
如图所示,我们的各项步骤和配置都检查,仍旧不发现任何问题,但一当运行时就会报错,这很让人百思不得其解。。。。。但其实问题肯定是出在配置里头,是不是哪个地方出现了覆盖,导致扫描路径不生效?

有了这个想法,我们就可以检查源代码中的所有关于mybatis的配置类。最后,我们发现了一个类,如下:
invalid bound statement(not found),笔记,mybatis,java,spring boot
源代码:

@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需要一致

这个错误是比较没水准,这里不做赘述。文章来源地址https://www.toymoban.com/news/detail-764300.html

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

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

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

相关文章

  • Invalid bound statement (not found) 原因和解决方法

    在我springboot项目,启动的时候,报了 Invalid bound statement (not found) :绑定语句无效(未找到) mapper接口和mapper.xml文件没有映射起来 1.查看mapper.xml中的namespace和接口mapper文件一致吗 2.看一下 target 里面有没有编译的mapper.xml文件 没有的话,打开maven点击clean一下,重新运行就ok了

    2024年02月14日
    浏览(33)
  • 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日
    浏览(41)
  • 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日
    浏览(51)
  • 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日
    浏览(56)
  • Invalid bound statement (not found)的原因以及解决方法

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

    2024年02月15日
    浏览(45)
  • 出现Invalid bound statement (not found)问题的解决办法(已解决)

    今天在写项目时出现了 Invalid bound statement (not found):xxxx 这个问题,网上找了很多博客都不行,最后修改了配置文件解决了问题,借此将此类问题常见的解决办法汇总一下。 1.mapper接口中的方法名和mapper.xml中的id标签不一致 推荐大家装MyBatisX这个插件,这样如果mapper中的方法名

    2023年04月26日
    浏览(43)
  • 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日
    浏览(61)
  • 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日
    浏览(58)
  • 解决Mybatis报错并分析原因:Invalid bound statement (not found): com.xxx.mapper.xxx

    今天同事在Mapper.xml自定义写了一个SQL,但是调用mapper的时候缺报错 我大概还原下场景 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.wyh.mapper.UserMapper.findByIDWYH 具体如下 一开始我觉得是不是没有扫描到mapper包,但是看了启动类,确实也配注解了呀 然后我又想 是

    2023年04月08日
    浏览(42)
  • org.apache.ibatis.binding.BindingException: Parameter ‘status‘ not found.

    从控制层传入的参数,在mapper文件中接收时,要使用@Param注解来进行接收,否则就会不知道哪个参数传的是哪个位置,如果方法中有多个参数,需要使用@Param(SQL参数占位符名称); 在原代码的基础上添加@Param注解 修改完之后,成功获取参数。

    2024年02月12日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包