项目场景:
开发搭建过程中,关于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目录下,如果不是,需要根据实际情况修改路径;
例如:
此处根据.properties与.yml文件格式的不同,存在略微的区别,相信大家都懂。
排查原因3:
3、SQL语句或存储过程不存在;(这个直接验证就好)
排查原因4:
4、检查你的mapper接口是否被正确地标注为@Mapper或者在Spring Boot中被作为一个组件进行扫描。 (像文章中的TestMapper接口类)
在这个问题的分析过程中,还可以尝试在XML映射文件中增加一些调试信息,如打印出正在使用的SQL语句,可以更加方便快速的定位问题所在。
我的问题:
错误发生在第2点上,对于1、3、4点我进行了反复的查看,一直没有查到问题;第2点中的问题,我对于编译生成的情况有进行简单的检查,发现有生成后,就并没有在意,到后面实在没办法了,只有想到这个点了,再次对于配置文件和xml的生成进行了检查,才发现了问题的所在。