org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

本文最后更新于 2024年8月2日 上午

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

10种可能的原因

  1. namespace与实际接口的全限定名不一致
  2. XML文件头出错,一般是复制错或者打错字
  3. SQL语句id出错,id与实际的接口方法名不一致
  4. 没写对resultType中实体类的全限定名
  5. resources文件夹下的包实际上没有分层次,只是加了点
  6. target里面没有XML,没有构造进去
  7. 用成了mybatis-plus,配置的却是mybatis
  8. XML文件和接口的所在的包名路径以及名称不一致,而mybatis-location又没有配置好。比如XML和接口都放在了java文件夹下,而又没有配置@MapperScan或者mybatis-location
  9. 启动类没有加@MapperScan或接口没有加@Mapper注解
  10. mybatis.type-aliases-type没有配置或配置错误(实证没配置也行)
  11. 你以为的XML文件实际没有后缀名

问题展示

XML文件

xml文件

项目结构

目录树

target目录

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。

这样实际的文件就会分层,而不是简单地在文件名里加点。


org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
https://novelyear.github.io/2024/08/02/org-apache-ibatis-binding-BindingException-Invalid-bound-statement-not-found/
作者
Leoo Yann
更新于
2024年8月2日
许可协议