org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
【问题描述】
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.edu.eduservice.mapper.EduCourseMapper.getPublishCourseInfo
at com.baomidou.mybatisplus.core.override.PageMapperMethod$SqlCommand.<init>(PageMapperMethod.java:261)
at com.baomidou.mybatisplus.core.override.PageMapperMethod.<init>(PageMapperMethod.java:58)
at com.baomidou.mybatisplus.core.override.PageMapperProxy.cachedMapperMethod(PageMapperProxy.java:70)
at com.baomidou.mybatisplus.core.override.PageMapperProxy.invoke(PageMapperProxy.java:63)
at com.sun.proxy.$Proxy92.getPublishCourseInfo(Unknown Source)
at com.edu.eduservice.service.impl.EduCourseServiceImpl.publishCourseInfo(EduCourseServiceImpl.java:105)
at com.edu.eduservice.service.impl.EduCourseServiceImpl$$FastClassBySpringCGLIB$$94000f8f.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685)
at com.edu.eduservice.service.impl.EduCourseServiceImpl$$EnhancerBySpringCGLIB$$8538f7ae.publishCourseInfo(<generated>)
at com.edu.eduservice.controller.EduCourseController.getPublishCourseInfo(EduCourseController.java:36)
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:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
【问题原因】
maven 只会对Java项目中的 .java 文件编译生成 .class。这个问题是因为 dao层编译后只有 class文件,没有mapper.xml,因为maven工程在默认情况下 src/main/java目录下的所有资源文件是不发布到 target目录下的。
【解决方案】
【解决方案一(常用)】:在Spring Boot 配置文件中添加配置
1 #配置mapper xml文件的路径 2 mybatis-plus.mapper-locations=classpath:com/edu/eduservice/mapper/xml/*.xml
在项目的 pom中配置如下节点,重新打包项目会发现 target目录下出现了xml文件夹
1 <!-- 项目打包时会将java目录中的*.xml文件也进行打包 --> 2 <build> 3 <resources> 4 <resource> 5 <directory>src/main/java</directory> 6 <includes> 7 <include>**/*.xml</include> 8 </includes> 9 <filtering>false</filtering> 10 </resource> 11 </resources> 12 </build>
【解决方案二(常见)】:你会发现你的项目中,所有xml 不是在 src/main/java 父目录下,而是位于 src/main/resources 这个父目录下定义了一个专门存储xml的文件。此时,就不需要配置任何参数,系统自动加载这些 xml,通过 xml解析器进行解析。有的架构师也喜欢用次方式。
【其他原因】
【1】检查 xml文件所在 package名称是否和 Mapper interface所在的包名;
【2】UserDao的方法在UserDao.xml中没有,然后执行UserDao的方法会报此;
【3】UserDao的方法返回值是 List<User>,而 select元素没有正确配置 ResultMap,或者只配置ResultType;
【4】如果你确认没有以上问题,请任意修改下对应的xml文件,比如删除一个空行保存。问题解决;
【5】看下mapper的 xml配置路径是否正确;