1、问题描述
Invalid bound statement (not found): com.txc.mybatisplus.mapper.Mapper.findAll
springboot整合MyBatis-Plus后,按照之前spring整合mybatis的用法,将StudentMapper.java接口和StudentMapper.xml映射文件,都创建在src下的mapper目录中,如下所示:
重点说明:此处的接口和映射文件命名需要遵循mapper代码开发四个规范。
规范1:接口的方法名与Statement的id相同
规范2:接口的返回值类型与Statement的resultType类型相同(ResultType只需要写单条数据的数据类型)
规范3:接口的传入参数与Statement的parameterType的类型相同。
规范4:映射文件中mapper的namespace值为接口的全类名,如:com.txc.mybatis.mapper.StudentMapper

这个时候访问StudentMapper.java接口中的方法findAll,报错,提示找不到findAll这个Statement。
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.txc.springbootjsp.mapper.StudentMapper.findAll
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235) ~[mybatis-3.5.9.jar:3.5.9]
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53) ~[mybatis-3.5.9.jar:3.5.9]
at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:108) ~[mybatis-3.5.9.jar:3.5.9]
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) ~[na:1.8.0_102]
at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:35) ~[mybatis-3.5.9.jar:3.5.9]
at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:95) ~[mybatis-3.5.9.jar:3.5.9]
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) ~[mybatis-3.5.9.jar:3.5.9]
at com.sun.proxy.$Proxy58.findAll(Unknown Source) ~[na:na]
at com.txc.springbootjsp.controller.TestController.test2(TestController.java:44) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_102]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_102]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_102]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.29.jar:5.3.29]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.29.jar:5.3.29]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.29.jar:5.3.29]
2、问题的原因分析
1、Mybatisplus加载映射的默认位置在resources/mapper目录中,而不是自定义的src中的目录,
解决该问题只需要修改xml映射文件的存储地址即可
2、如果是Mybatis出现这个问题,主要是因为java工程的src中默认不编译和加载xml文件,需要在maven工程的pom.xml配置读取src中的xml文件。解决方式在下面。
3、解决办法
3.1、Mybatisplus解决办法1
将xml映射文件放置在resources/mapper目录中

3.2、Mybatisplus解决办法2
自定义xml映射文件的存储位置,在application.yml(application.properties)文件中创建如下配置
mapper-locations: classpath:/mapper/**.xml:指定存放目录
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: false
#放到resource下
mapper-locations: classpath:/mapper/**.xml
#放到src/main/java目录下
#classpath:/com/*/*/mapper/*Mapper.xml
3.3、Mybatis解决方案
更新后,一定要重新加载maven工程
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<build>
文章讲述了在SpringBoot项目中整合MyBatis-Plus时,由于默认配置问题导致的findAll接口调用错误。作者分析了原因,提供了将XML映射文件放在resources/mapper或自定义配置文件中的解决方案。
2898

被折叠的 条评论
为什么被折叠?



