解决mybatis/mybatis plus报错:Invalid bound statement (not found) 的方法汇总

2024-05-28 13:12

本文主要是介绍解决mybatis/mybatis plus报错:Invalid bound statement (not found) 的方法汇总,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题,即在mybatis中dao接口与mapper配置文件在做映射绑定的时候接口与xml不匹配,要么是找不到,要么是找到了却匹配不到。

  我的问题是项目没有把最新的方法xml打包进项目,mybatis-plus从xml中找到与dao对应的接口名称。按第6种方法解决了。

  若大家遇到这个错,首页到项目打到处检查mapper的xml中是否有最新方法。不然,你按网上的方法查找很久才能找到问题点。

  

我的maven项目引入mybatis-plus的pom.xml配置如下:

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

我的yml配置如下:

mybatis-plus:configuration:map-underscore-to-camel-case: trueauto-mapping-behavior: full# log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath*:/**/mapper/**/*.xmltype-aliases-package: com.tfq.dao

我在CategoryBrandRelationDao.xml中添加了一个方法updateCategory。

<?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.tfq.dao.CategoryBrandRelationDao"><!-- 可根据自己的需求,是否要使用 --><resultMap type="com.tfq.entity.CategoryBrandRelationEntity" id="categoryBrandRelationMap"><result property="id" column="id"/><result property="brandId" column="brand_id"/><result property="catelogId" column="catelog_id"/><result property="brandName" column="brand_name"/><result property="catelogName" column="catelog_name"/></resultMap><update id="updateCategory">UPDATE pms_category_brand_relationSET catelog_name=#{name}WHERE catelog_id = #{catId}</update></mapper>

于是我google搜可能出现的问题,按网上汇总问题依次排查:

1、检查xml文件的namespace是否对应接口,要是全路径。

xml文件名不需要和接口名一致,namespace和接口全类名一致即可。

2、xml中的函数id和接口中的函数名是否对得上,参数类型、返回值类型是否对得上

3、去看输出目录中有没有xml映射文件,maven项目默认把资源文件放在src/main/resources下,默认只识别src/main/resources下的资源文件。

如果你把xml映射文件等资源文件放到src/main/java的某个目录下,识别不了,需要在pom.xml中配置一下:

<resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource></resources>

4、看一下mybatis的配置在yml中对不对

我的项目yml配置在上面已贴出来。

我的mapper.xml文件都放到resources的标红目录。而Sprinboot启动时 log中Property 'mapperLocations' was not specified这句提示开始没引起了我的注意,后面找到是配置的xml的文件中update没被加载到Mybatis-plus的缓存中才看到。其实在yml中配置了mybatis-plus.mapper-locations=classpath*:**/mapper/xml/*.xml(没用),启动器没扫描到新加的xml中方法,十分奇怪。

注意:Maven 多模块项目的扫描路径需以 classpath*: 开头 (即加载多个 jar 包下的 XML 文件)

5、看一下xml映射文件是否带了后缀名.xml

这个很容易被忽略,一次SpringBoot中使用MyBatis时我调了半天,其它可能性都被排除了,愣是找不到原因,最后发现是我创建映射文件时直接输入UserDaoMapper,没带后缀.xml。

你不带后缀.xml,IDEA根据文件内容能识别它是xml文件,显示的图标也是xml文件的,但不带.xml后缀就不是映射文件,运行时识别不了。

我按以上方法都试了,还是报相同错。这让我很纳闷。于我开始根据mybatis-plus报错的源代码进行debug,首先进入MybatisMapperMethod.java

public class MybatisMapperMethod {public MybatisMapperMethod(Class<?> mapperInterface, Method method, Configuration config) {//找dao接口与xml中配置的方法名称进行匹配入口this.command = new MapperMethod.SqlCommand(config, mapperInterface, method);this.method = new MapperMethod.MethodSignature(config, mapperInterface, method);}}

在进入MapperMethod.java类

public SqlCommand(Configuration configuration, Class<?> mapperInterface, Method method) {final String methodName = method.getName();final Class<?> declaringClass = method.getDeclaringClass();//这个方法从mapper的xml中加载所有的配置数据,然后把dao接口名称与xml中配置对比返回一个mapper对象。MappedStatement ms = resolveMappedStatement(mapperInterface, methodName, declaringClass,configuration);if (ms == null) {if (method.getAnnotation(Flush.class) != null) {name = null;type = SqlCommandType.FLUSH;} else {//如果查找的mapper对象为空就抛出dao接口与xml不一致。throw new BindingException("Invalid bound statement (not found): "+ mapperInterface.getName() + "." + methodName);}} else {name = ms.getId();type = ms.getSqlCommandType();if (type == SqlCommandType.UNKNOWN) {throw new BindingException("Unknown execution method for: " + name);}}}

在resolveMappedStatement方法

private MappedStatement resolveMappedStatement(Class<?> mapperInterface, String methodName,Class<?> declaringClass, Configuration configuration) {String statementId = mapperInterface.getName() + "." + methodName;//特别注意configuration,它是加载你项目中配置的所有mapper的xml,若你发现这里面没有,//则是项目启动时没有把xml最新数据加载,然后去检查你的配置。if (configuration.hasStatement(statementId)) {return configuration.getMappedStatement(statementId);} else if (mapperInterface.equals(declaringClass)) {return null;}//后面代码省略...
}

解决方法

6.将配置文件放在 resource 文件夹中,对于 Maven 项目,可指定 POM 文件的 resource

<build><resources><!--指定资源的位置(xml放在resources下,可以不用指定)--><resource><directory>src/main/resources</directory></resource></resources>
</build>

加了这个配置,项目clean--->compile---->package,要你的项目就有最新的mapper的xml方法了。

参考blog:

mybatis-plus配置找不到Mapper接口路径的坑_mybatis-plus.mapper-locations-CSDN博客

https://www.cnblogs.com/chy18883701161/p/12695356.html

IDEA使用mybatis-plus 时出现的问题 Property ‘mapperLocations‘ was not specified &Invalid bound statement_property "mapperlocations-CSDN博客

这篇关于解决mybatis/mybatis plus报错:Invalid bound statement (not found) 的方法汇总的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010667

相关文章

查看MySQL数据库版本的四种方法

《查看MySQL数据库版本的四种方法》查看MySQL数据库的版本信息可以通过多种方法实现,包括使用命令行工具、SQL查询语句和图形化管理工具等,以下是详细的步骤和示例代码,需要的朋友可以参考下... 目录方法一:使用命令行工具1. 使用 mysql 命令示例:方法二:使用 mysqladmin 命令示例:方

Python与Java交互出现乱码的问题解决

《Python与Java交互出现乱码的问题解决》在现代软件开发中,跨语言系统的集成已经成为日常工作的一部分,特别是当Python和Java之间进行交互时,编码问题往往会成为导致数据传输错误、乱码以及难... 目录背景:为什么会出现乱码问题产生的场景解决方案:确保统一的UTF-8编码完整代码示例总结在现代软件

JavaScript时间戳与时间的转化常用方法

《JavaScript时间戳与时间的转化常用方法》在JavaScript中,时间戳(Timestamp)通常指Unix时间戳,即从1970年1月1日00:00:00UTC到某个时间点经过的毫秒数,下面... 目录1. 获取当前时间戳2. 时间戳 → 时间对象3. 时间戳php → 格式化字符串4. 时间字符

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Java中的getBytes()方法使用详解

《Java中的getBytes()方法使用详解》:本文主要介绍Java中getBytes()方法使用的相关资料,getBytes()方法有多个重载形式,可以根据需要指定字符集来进行转换,文中通过代... 目录前言一、常见重载形式二、示例代码三、getBytes(Charset charset)和getByt

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

《解决Maven项目报错:failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题》这篇文章主要介... 目录Maven项目报错:failed to execute goal org.apache.maven.pl

nginx负载均衡及详细配置方法

《nginx负载均衡及详细配置方法》Nginx作为一种高效的Web服务器和反向代理服务器,广泛应用于网站的负载均衡中,:本文主要介绍nginx负载均衡及详细配置,需要的朋友可以参考下... 目录一、 nginx负载均衡策略1.1 基本负载均衡策略1.2 第三方策略1.3 策略对比二、 nginx配置2.1