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

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

问题描述


我们在使用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文件的位置。

37.png

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

#默认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依赖后,配置框架相关的配置项是不会出现黄线下划线提醒的。只有用户自定义的一些配置项,会出现黄线下划线提醒。

36.png

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


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文件间相互跳转。

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

34.png

353.png



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

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


Mapper接口方法:

33.png


xml中对于的sql:

32.png


5、检测resultType和resultMap的配置

31.png


总结


本文主要是针对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之间的映射关系。

目录
相关文章
|
6月前
|
Prometheus Cloud Native 关系型数据库
实时计算 Flink版操作报错合集之实时计算 Flink版操作报错合集之当从保存点恢复并添加新的表时,出现了org.apache.flink.util.FlinkRuntimeException异常,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
7月前
|
XML Java 数据库连接
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):XXXXX
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):XXXXX
106 1
|
6月前
|
Java 数据库连接 mybatis
Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid
Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid
|
8月前
|
XML Java 数据库连接
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.forum.d
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.forum.d
77 1
|
7月前
|
IDE Java 应用服务中间件
解决org.apache.jasper.JasperException异常
解决org.apache.jasper.JasperException异常
|
Java Apache Maven
【异常解决】Handler dispatch failed;nested exception is java.lang.NoClassDefFoundError: org/apache/common
【异常解决】Handler dispatch failed;nested exception is java.lang.NoClassDefFoundError: org/apache/common
4359 0
|
8月前
|
前端开发 Java 数据库连接
若依 mybatis报错nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX‘ 错误
若依 mybatis报错nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX‘ 错误
176 0
|
存储 Cloud Native 应用服务中间件
解决Apache Tomcat “Request header is too large“ 异常 ‍
解决Apache Tomcat “Request header is too large“ 异常 ‍
307 1
org.apache.ibatis.builder.BuilderException: An invalid property ‘jdbcType ‘ was found in mapping
org.apache.ibatis.builder.BuilderException: An invalid property ‘jdbcType ‘ was found in mapping
112 0
|
1月前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
341 33
The Past, Present and Future of Apache Flink

热门文章

最新文章

推荐镜像

更多