org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 问题分析与解决

本文讲述了在开发过程中遇到的Mybatis映射错误,重点分析了可能的原因,包括XML配置错误、路径问题、SQL不存在和接口扫描等,并给出了详细的排查和解决步骤。作者最后分享了自己解决此类问题的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

开发搭建过程中,关于Mybatis映射错误分析与解决过程:
*org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com...infrastructure.mapper.Mapper.finds

在这里插入图片描述

问题描述

贴入简化代码:
TestServiceImpl.java

public class TestServiceImpl implements TestService{

	@Resource
	TestMapper mapper;
	
	public void finds(Integer id){
		mapper.finds(id);
	}
	
}

com.test.demo.TestMapper.java

@Mapper
public interface TestMapper{

	Integer finds(Integer id);
}

TestMapper.xml

<?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.test.demo.TestMapper">
    <select id="finds" resultType="java.lang.Integer">
        select count(1) from tableA tar where colnumA = 1;
    </select>
</mapper>

原因分析:

从抛出的异常描述来看,是Mybatis的xml解析绑定出现了错误!通常这个错误表示MyBatis在解析XML映射文件时无法找到对应的SQL语句或存储过程。可能是以下原因导致的:

1、SQL语句的xml映射文件未正确配置或不存在
   
2、XML映射文件路径不正确;

3、SQL语句或存储过程不存在;

4、检查你的mapper接口是否被正确地标注为@Mapper或者在Spring Boot中被作为一个组件进行扫描。

解决方案:

排查原因1:

1、 TestMapper.java的接口与TestMapper.xml的映射文件,其中namespace需要与TestMapper的全限定名相同(如文章中的 `com.test.demo.TestMapper`全路径名),同时,在TestMapper接口中的方法和xml文件中的SQL语句的id也需要完全匹配。

排查原因2:

2、在web应用中,应该位于WEB-INF/classes目录下,如果不是,需要根据实际情况修改路径;
例如:

Mapper位置

此处根据.properties与.yml文件格式的不同,存在略微的区别,相信大家都懂。
在这里插入图片描述
在这里插入图片描述

排查原因3:

3、SQL语句或存储过程不存在;(这个直接验证就好)

排查原因4:

4、检查你的mapper接口是否被正确地标注为@Mapper或者在Spring Boot中被作为一个组件进行扫描。 (像文章中的TestMapper接口类)

在这里插入图片描述
在这个问题的分析过程中,还可以尝试在XML映射文件中增加一些调试信息,如打印出正在使用的SQL语句,可以更加方便快速的定位问题所在。

我的问题:
错误发生在第2点上,对于1、3、4点我进行了反复的查看,一直没有查到问题;第2点中的问题,我对于编译生成的情况有进行简单的检查,发现有生成后,就并没有在意,到后面实在没办法了,只有想到这个点了,再次对于配置文件和xml的生成进行了检查,才发现了问题的所在。

又再一次出现了同样的问题:

新的解决方法:点击跳转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值