org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 常见的解决方案和新遇到的问题

文章讲述了在遇到MyBatis的BindingException,提示Invalidboundstatement时,应如何排查问题,包括检查Mapper文件绑定、接口方法名与XMLID一致性、配置文件中的mapper-locations、启动类的Mapper包扫描、多层文件夹结构的正确创建以及编译后的mapper文件映射等。强调了解决此类问题需细致排查各个可能的原因。

问题描述

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.dao.mysql.Mapper.select
	at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)
	at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53)
	at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:108)
	at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
	at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:35)
	at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:95)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
	at com.sun.proxy.$Proxy103.selectEquipmentState(Unknown Source)

报错信息如上所示,给人第一反应就是mapper文件绑定关系不对,但是会有多种情况导致这样的报错,需要我们耐心且细心的一步步排查。其实服务在启动的时候也已经给过警告信息了,只是一般不报错的情况下,我们也没有去细看,知道后来才发现,如图:

 WARN 4192 --- [  restartedMain] o.m.s.mapper.ClassPathMapperScanner      : Skipping MapperFactoryBean with name 'Mapper' and 'com.dao.mysql.Mapper' mapperInterface. Bean already defined with the same name!
 WARN 4192 --- [  restartedMain] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[com.dao.mysql]' package. Please check your configuration.

第一种方案:

检查对应的xml文件是否映射到mapper文件上,在xml文件的namespace上,按住ctrl键不放,鼠标移动到对应的mapper文件名上是可以点击过去的;或者可以用mybatis组件是可以直接跳转,如图所示:
在这里插入图片描述
在这里插入图片描述


第二种方案:

检查mapper接口中的方法名和mapper.xml中的id标签是否一致

在这里插入图片描述

第三种方案:

如果说mapper映射没有问题,那么就有可能的配置问题。先检查yml或者properties配置文件里的mapper-locations

# 指定路径
mybatis:
  mapper-locations: classpath*:mapper/*.xml
# 多文件路径
## 第一种写法
mybatis:
  mapper-locations: classpath*:mapper/*/*.xml
## 第二种写法
mybatis:
  mapper-locations: classpath*:mapper/a/*.xml,mapper/b/*.xml    
# 多层文件多路径写法  
  mybatis:
  mapper-locations: classpath*:mapper/**/*.xml

然后检查数据源配置的路径对不对
在这里插入图片描述

第四种方案:

检查你的启动类是否增加了mapper包扫描注解,检查包扫描路径的正确性

@SpringBootApplication
@EnableSwagger2
@MapperScan(basePackages = "com.dao")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

如果你在数据源配置文件里就已经加了包扫描,启动类里就不需要再加mapper包扫描,参照第三种方案。

第四种方案:

有时候我们会在创建多层文件夹的时候会图方便,一次性创建完,如:mapper.aaa.vvv
看图吧,更直观:
在这里插入图片描述

然后看不到有任何的异常,但是这只是一个文件夹,而不是层级文件夹,会导致mapper文件路径跟xml文件路径不一致,正确创建方式应该是:mapper/aaa/vvv
idea有一个很好的排查方式,点击项目右上角的齿轮,取消缩减中间包,如图:
在这里插入图片描述
**>

效果如下:

在这里插入图片描述

第五种方案:

检查target文件下mapper文件是否映射上,因为我们知道所有的文件都是经过编译器编译成class文件来被机器来读取,如果不对可以重新编译一下
在这里插入图片描述

第六种方案:

这种的由单数据源改配多数据源的情况下,所有的配置映射关系都没有问题。请求第一个数据源接口返回正常,请求第二个数据源所有接口都报未绑定这个错。
排查第一个数据源配置文件里读取的mapper文件路径应该到存放对应mapper文件那一层级,否则可能读取了其他数据源的mapper文件,你在调用接口的时候就会默认到第一数据源里面去找,很显然是不会匹配上的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
xml配置读取也一样,都做区分避免出问题

总结

	遇到问题还是多思考,即使是平时很常见的问题,也有可能让你找好久才找到原因。一定要根据报错去找问题,
	能导致问题就那么几个点,一定要细心一点点去排查,就能发现蛛丝马迹。
### 解决 MyBatis `Invalid bound statement (not found)` 错误 当遇到 `org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)` 错误时,通常意味着 MyBatis 无法找到映射到特定命名空间下的 SQL 语句。此问题可能由多种因素引起。 #### 映射文件配置不正确 如果 Mapper 接口中的方法名称与其对应的 XML 文件内的 ID 不匹配,则会触发该异常。确保 Mapper 接口中定义的方法名与 XML 配置文件里的 `<select>` 或其他标签的 id 属性完全一致[^1]。 ```xml <!-- 正确 --> <mapper namespace="com.example.mapper.UserMapper"> <select id="getUserById" parameterType="int" resultType="User"> SELECT * FROM users WHERE user_id = #{id} </select> </mapper> // 对应 Java 方法签名也需保持同步 public interface UserMapper { User getUserById(int id); } ``` #### 资源加载失败 有时即使路径看起来是对的,但如果资源没有被正确打包进最终的应用程序包里(比如 JAR),也会导致此类错误发生。对于 Maven 构建工具来说,应该确认项目的 `pom.xml` 是否包含了合适的资源过滤规则来包含这些 XML 文件[^5]。 ```xml <build> <resources> <!-- 确保 resources 下面的 xml 文件会被编译进入 classpath --> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> </resources> </build> ``` #### 缺少必要的依赖项或版本冲突 某些情况下,可能是由于缺少了必需的库或者是不同版本之间的兼容性问题所引起的。检查应用程序使用的 MyBatis 及其扩展插件(如 MyBatis Plus)是否都处于最稳定版,并且相互之间不存在版本差异[^2]。 #### 名字空间声明不当 在 XML 映射文档顶部指定的名字空间应当精确对应于相应的 DAO/Repository 类全限定类名。任何拼写上的失误都会造成找不到绑定语句的情况出现[^3]。 ```xml <!-- 错误示范 --> <mapper namespace="com.exmaple.userdao"> <!-- 注意这里 "exmaple" 的拼写 --> <!-- 正确方式 --> <mapper namespace="com.example.userDao"> ``` 完成上述调整之后,建议清理并重构建整个工程以确保更改生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值