org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
本文最后更新于 2024年8月2日 上午
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
10种可能的原因
- namespace与实际接口的全限定名不一致
- XML文件头出错,一般是复制错或者打错字
- SQL语句id出错,id与实际的接口方法名不一致
- 没写对resultType中实体类的全限定名
- resources文件夹下的包实际上没有分层次,只是加了点
- target里面没有XML,没有构造进去
- 用成了mybatis-plus,配置的却是mybatis
- XML文件和接口的所在的包名路径以及名称不一致,而mybatis-location又没有配置好。比如XML和接口都放在了java文件夹下,而又没有配置@MapperScan或者mybatis-location
- 启动类没有加@MapperScan或接口没有加@Mapper注解
mybatis.type-aliases-type没有配置或配置错误(实证没配置也行)- 你以为的XML文件实际没有后缀名
问题展示
XML文件
项目结构
target目录
application.properties文件
Mapper接口
启动类
报错信息
问题描述
问题在于XML没有跟Mapper接口关联上,通过注解开发是有效的,但换成XML映射就报错。
已经检查过id、namespace、resultType、XML文件头等是否出现打错。
配置了mybatis的实体类位置、xml位置、添加了@Mapper注解、为启动类添加了@MapperScan注解、检查了target中有没有XML、检查了是否用成了mybatis-plus。
MybatisX插件已经匹配上了,出现红蓝鸟标识。
最终仍然没用,增删改查接口没一个能用。
解决过程
尝试了能搜到的所有方法仍无效后。
我在项目中新建了一个模块:
- 创建了mapper包和一个pojo包
- 复制了一个实体类和一个select * 的查询接口过来
- 复制了application.properties的连接数据库的配置
- 在resources下新建包,又创建了一个XML,填好内容后编写了一个简单测试方法来调用这个select *接口。
成功了,xml成功与接口关联并且select * 了。证明是可以实现XML与接口关联的。
加上controller层、service层,仍然可以映射,访问成功。
于是开两个窗口与新建的模块仔细对比,发现除了模块名完全没区别,那么区别就只能在IDE上看不到的位置。
最后发现了,就是原因5,实际文件夹没有按点dot分层设置,实际文件结构是这样的:com--newyear--goovermanege.mapper
前两级目录分开了,但是最后一层目录名却是goovermanage.mapper
,于是手动拆分,再次测试,成功。
原来是这么小一个BUG。。真是菜啊,查了两天下午才查出来😅
预防措施
在resourses下创建分级目录时,不要打点,打"/"。比如com.ABC.mapper就打成com/ABC/mapper。
这样实际的文件就会分层,而不是简单地在文件名里加点。