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配置路径是否正确;

posted @ 2020-11-22 00:43  Java程序员进阶  阅读(6)  评论(0编辑  收藏  举报