首页 > 其他分享 >mybatis-plus异常记录:org.apache.ibatis.binding.BindingException Invalid bound statement

mybatis-plus异常记录:org.apache.ibatis.binding.BindingException Invalid bound statement

时间:2022-12-07 17:34:43浏览次数:58  
标签:xml mapper 配置 binding bound locations plus statement mybatis


问题描述

我们在使用mybatis或mybatis-plus作为持久化框架的时候,通过dao层接口调用xml中配置好的sql时,常常会遇到​​org.apache.ibatis.binding.BindingException Invalid bound statement​​的问题。

异常简单来说:就是​​无效的sql绑定,即通过dao层接口的方法名称没有找到对应的sql语句​​。

在百度上查询的文章中发现大家对该问题的解决和总结都非常片面,不够全面。
所以分享下自己对该问题的解决思路。

项目环境

​spring boot + mybatis-plus​


解决方案:

1、检测mapper-locations配置项是否正确

mapper-locations配置项是用来告诉Mapper所对应的XML文件的位置。
如果该文件位置配置错误,那么其他内容配置再怎么正确,依然会报错。
这也是该异常​​​最重要又最容易​​被忽略的一个原因。

另外,​​由于Mapper所对应的XML文件属于静态文件资源,所以一定要存放在resoureces目录​​。

这里说下我项目中遇到的问题:
已经在配置文件中添加了如下配置,指定Mapper所对应的XML文件的位置:

mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

并且也检查了配置的路径是正确的,没有问题。
但在执行dao层自定义的方法时,还是一直出现异常。

原因:

在官网查看了mybatis-plus的配置文档后,终于发现在mybatis-plus框架下,需要通过​​mybatis-plus.mapper-locations​​来指定XML文件的位置。

mybatis-plus异常记录:org.apache.ibatis.binding.BindingException Invalid bound statement_mybatis-plus


修改为如下配置后,问题修复。

#默认classpath*:/mapper/**/*.xml,推荐明确配置,出现问题更好排查
mybatis-plus.mapper-locations=classpath*:/mapper/*.xml

小结⚠️:
注意在mybatis框架和mybatis-plus框架下配置项的区别:

  • mybatis框架下指定XML路径

maven依赖:

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
</dependency>

对应的xml路径的配置属性​​mybatis.mapper-locations​​:

mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
  • mybatis-plus框架下指定XML路径

maven依赖:

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>

对应的xml路径的配置属性​​mybatis-plus.mapper-locations​​:

mybatis-plus.mapper-locations=classpath:mybatis/mapper/*.xml

注意⚠️:
很多人可能会奇怪自己项目中明明没有明确配置mapper-locations的属性,但是执行mapper中自定义的方法确并没有报错。这是由于​​​无论是mybatis框架还是mybatis-plus框架下的start自动配置包都对mapper-locations属性有默认的路径配置classpath*:/mapper/**/*.xml,这也符合spring boot中约定大于配置的规范。​

大家在使用IDEA开发中,也可以注意配置项下面的黄线,会提示不能解析对应的配置项。

一般引入了框架对应的start依赖后,配置框架相关的配置项是不会出现黄线下划线提醒的。只有用户自定义的一些配置项,会出现黄线下划线提醒。

mybatis-plus异常记录:org.apache.ibatis.binding.BindingException Invalid bound statement_java_02


所以,​​框架的配置项如果出现黄线下划线提示,大家一定要高度重视​​。

2、检测dao层接口是否注入spring容器

这部分在之前的文章中已经提到,​​@MapperScan​​​和​​@Mapper​​一定要任选一种进行配置,如果采用@MapperScan则一定要正确配置中Mapper接口所在的目录,确保在项目启动时,Mapper接口都注入到Spring容器中。

启动类Application:

@SpringBootApplication
@Slf4j
@MapperScan("com.laowan.mybatis_plus.mapper")
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
log.info("mybatis_plus_demo 启动成功");
}
}

@Mapper配置方法:

@Mapper
public interface UserMapper extends BaseMapper<User> {

}

两者任意选择一种方式配置即可,如果都不配置,那么在执行dao层方法进行数据操作时,会出现在spring容器中找不到对应的bean的异常。

@Mapper和@MapperScan都不配置调用mapper方法时出现的异常:
​​​Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.laowan.mybatis_plus.mapper.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}​

3、检测xml文件中namespace是否配置正确

针对这部分的检测,强烈推荐大家在idea上安装​​mybatisx​​插件,借助插件快速检查是否匹配。

官方文档:​​https://baomidou.com/pages/ba5b24​

安装好插件后,在mapper接口和xml文件中就会出现这样的小企鹅。

点击小企鹅就可以在mapper接口和xml文件间相互跳转。

如果配置错误,将不能进行跳转或调整到错误的文件中。

mybatis-plus异常记录:org.apache.ibatis.binding.BindingException Invalid bound statement_java_03


mybatis-plus异常记录:org.apache.ibatis.binding.BindingException Invalid bound statement_mybatis_04

4、检测dao层接口的方法名和sql的id是否匹配

也可以借助​​mybatisx​​插件快速检测。同样,如果名称不匹配,不会出现对应的红蓝小企鹅。

Mapper接口方法:

mybatis-plus异常记录:org.apache.ibatis.binding.BindingException Invalid bound statement_mybatis_05

xml中对于的sql:

mybatis-plus异常记录:org.apache.ibatis.binding.BindingException Invalid bound statement_java_06

5、检测resultType和resultMap的配置

mybatis-plus异常记录:org.apache.ibatis.binding.BindingException Invalid bound statement_java_07

总结

本文主要是针对spring boot + mybatis-plus框架下的常见异常:​​org.apache.ibatis.binding.BindingException Invalid bound statement​​的一些解决手段进行了说明。

1、在mybatis框架下,主要需要保证2点:

  • Mapper所对应的XML文件的位置要通过​​mapper-locations​​属性配置正确
  • Mapper接口需要通过​​@MapperScan​​​或​​@Mapper​​注入到Spring容器中

2、注意mybatis框架和mybatis-plus配置项的区别

  • mybatis框架下mapper-locations配置项为:​​mybatis.mapper-locations​
  • mybatis-plus框架下mapper-locations配置项为:​​mybatis-plus.mapper-locations​

3、利用​​mybatisx​​插件快速检测命名空间、方法名和sql的id之间的映射关系。


标签:xml,mapper,配置,binding,bound,locations,plus,statement,mybatis
From: https://blog.51cto.com/u_15905482/5919839

相关文章

  • 一种有界队列(Bounded Buffer)的实现
    一、概述在有CPU和GPU参与的一种运算中,比如深度学习推理,CPU需要预处理数据,然后交给GPU处理,最后CPU对GPU的运算结果进行后处理。在整个过程中都是FIFO,即数据......
  • WPF之Binding深入探讨
    1,DataBinding在WPF中的地位程序的本质是数据+算法。数据会在存储、逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要。但算法在3层中的分布是不均匀的,对于一......
  • Android 开启 viewBinding,减少 findViewById 语句的使用
    找到build.gradle文件,因为有两个build.gradle,我们要操作的是第二个:在这个位置加上这一句话,然后点击右上角的SyncNow按钮更新项目:viewBinding{enabled=tr......
  • 【转】wcf系列5天速成——第一天 binding的使用(1)
    wcf系列5天速成——第一天binding的使用(1) 作为WCF速成系列,只介绍些项目开发中常用到的实战知识。 学习wcf,还是对其中的几个术语要了解一下。wcf中有一个ABC......
  • 【转】wcf系列5天速成——第二天 binding的使用(2)
    wcf系列5天速成——第二天binding的使用(2) 承接上一章,今天来讲MSMQ在实战项目中的应用。众所周知,放了防止订单丢失,我们都是采用Order过一下MSMQ。   MSMQ的......
  • WebKitFormBoundary型POST怎么解决
    curl网站:https://curlconverter.com/  复制粘贴到下图红框中  然后使用生成的请求头和参数发起请求即可......
  • vba-UBound
    UBound为VisualBasic中的一个函数,用来返回数组或元素相应维度的最大值。同理,LBound函数是获取最小值......
  • Android - DataBinding源码解读(内存消耗和双向绑定原理分析)
    目录​​一代码Demo​​​​二解析​​​​2.1 关键的ActivityMainBindingImp()​​​​2.2 ​​​​2.3​​​​三总结​​​​3.1内存消耗的三个地方:​​​​3.2 ......
  • DataGridView绑定BindingList 中的 DataGridViewCheckBoxColumn 无法点击排序问题
    参考文档DataGridView绑定BindingList<T>带数据排序的类-腾讯云开发者社区-腾讯云(tencent.com) DataGridView使用技巧十三:点击列头实现升序和降序排序-.NET开发......
  • wpf binding例子 优化
    1、binding源为非控件,而是C#类/实例窗体(V)代码,<Windowx:Class="WpfBindingApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x......