文章目录
1.org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题解决
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.study.mapper.UserMapper.findAll
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 org.apache.ibatis.binding.MapperProxy$$Lambda$930/899736725.apply(Unknown Source)
at org.apache.ibatis.util.MapUtil$$Lambda$664/1746458880.apply(Unknown Source)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:36)
at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:95)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
at com.sun.proxy.$Proxy64.findAll(Unknown Source)
at com.study.SpringbootSsmApplicationTests.testFindAll(SpringbootSsmApplicationTests.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at
1.1 问题分析
我们首先来看报错详情,org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.study.mapper.UserMapper.findAll
是ibatis报错的错误,指无效的绑定语句(找不到)com.study.mapper.UserMapper.findAll
方法;
1.2 路径问题导致
一般这类错误都是路径不对导致的问题,一般要关注俩个地方:
1. mapper接口文件(又被称为dao层)要和mapper.xml文件进行映射;
2. 配置文件指定Mybatis加载Mapper映射文件的路径要正确
mapper接口文件(又被称为dao层)和mapper.xml文件进行映射的定义是在mapper.xml文件中的namespace处进行指定的,检查此处指向的路径是否正确;
配置文件指定Mybatis加载Mapper映射文件的路径层级目录拼接一定要注意使用拼接符的使用,一般情况下使用/
进行拼接:
但是我这里出现了一个特殊情况,目录结构创建时我本意是:mybatis/mappers/UserMapper.xml
,但是IDEA在创建时认为其目录为mybatis.mappers/UserMapper.xml
,也就是说我本意是想指定mybatis下还有一级目录mappers,但是IDEA认为你只创建了一个目录,它名字就叫mybatis.mappers;
这就导致项目启动时找不到对应目录报错,所以在有关路径方面数据,建议直接进行复制、粘贴,这样是最准确的:
当然如果路径正确,但是对应路径下没有对应的方法也会报这个错误;
1.3 编译.xml
文件失败
Java程序是在虚拟机进行编译后运行的,有时候会出现main/java
目录下的.xml
不编译的情况,我们在target/classes
目录下可以查看编译后的文件,检查.xml
是否成功编译:
如果未编译的话,可以在pom.xml
文件中添加下列内容:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
添加后刷新Maven重启项目即可;
1.4 总结
mybatis是一个十分成熟的插件,一般不会有这么明显的BUG存在,所以报错大多情况下都是自定义相关内容的错误,如果上面内容排查完后还没有解决,那么相信我,一定是路径问题导致的,所以涉及路径相关的地方,全部使用直接复制目录路径的方式进行替换后重试;