MMP,MP 【Invalid bound statement (not found) 】异常

532 阅读3分钟

问题描述

单元测试

image.png

这里测试的是自定义的 SQL 语句,根据 id 获取对应实体对象。

报错显示

image.png

Org.apache.ibati.binding.BindingException:无效的绑定语句(未找到)

问题剖析

不要怀疑,正视自己,这个异常肯定是你插入的姿势不对……

  • 检查是不是引入 jar 冲突

  • 检查 Mapper.java 的扫描路径

    • 方法一:在 Configuration 类上使用注解 MapperScan

    • 方法二:在Configuration类里面,配置MapperScannerConfigurer

              @Bean
              public MapperScannerConfigurer mapperScannerConfigurer(){
                  MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
                  // 可以通过环境变量获取你的 mapper 路径,这样 mapper 扫描可以通过配置文件配置了
                  scannerConfigurer.setBasePackage("项目中 mapper 目录的相对路径");
                  return scannerConfigurer;
              }
      
    • 方法三:查看项目启动类上有没有加注释 MapperScan

      @SpringBootApplication
      @MapperScan("项目中 mapper 目录的相对路径")
      public class YourApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(YourApplication.class, args);
          }
      
      }
      
  • 检查是否指定了主键?如未指定,则会导致 selectById 相关 ID 无法操作,请用注解 @TableId 注解表 ID 主键。当然 @TableId 注解可以没有!但是你的主键必须叫 id(忽略大小写)

  • SqlSessionFactory 不要使用原生的,请使用 MybatisSqlSessionFactory

  • 检查是否自定义了 SqlInjector ,是否复写了 getMethodList() 方法,该方法里是否注入了你需要的方法(可参考 DefaultSqlInjector

  • 由于测试的方法是持久层自定义的方法,不是 Mybatis Plus 中内置的方法,无法调用的原因及有可能没有配置 XML 扫描路径:

    • 如果是 mybatisplus-spring-mvc,具体配置如下:
      <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
          <property name="dataSource" ref="dataSource" />
          <property name="typeAliasesPackage" value="xxx.entity" />
          <property name="mapperLocations" value="classpath*:/mybatis/*/*.xml"/>
          ...
      </bean>
      
    • 如果是 mybatisplus-spring-boot,具体配置如下:
      mybatis-plus:
        mapper-locations: classpath*:/mapper/**/*.xml
      
      • 如果不是使用 .yaml 配置,使用的是 .properties 配置,具体如下:
        mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml
        

注意: 配置 mapper-locations ,具体还要看你的项目目录结构,通过类路径往下找到存放映射 xml 文件目录,以防万一,可以在目标目录上右键 Copy Reference 【Ctrl + Alt + Shift + C】(ps: 仅限于使用 IDEA 的小伙伴)。

此外,Maven 多模块项目的扫描路径需以 classpath*: 开头 (即加载多个 jar 包下的 XML 文件)。

image.png

问题解决

通过检查上述配置,发现没有任何毛病问题,不管是@MapperScan 注解还是 @TableId(value = "fruit_id" type = IdType.AUTO) 注解的添加,都无济于事,直到我将 xml 目录从 java 文件夹下移入到 resources 目录下,再次修改 yaml 配置文件中 mapper-locations 属性,回到 SpringBoot 测试类中单击倒三角运行图标,竟然惊喜地发现成功通过了测试。

image.png

原来是对于 IDEA 系列编辑器,XML 文件是不能放在 java 文件夹中的,IDEA 默认不会编译源码文件夹中的 XML 文件,以下是解决方法:

  • 将配置文件放在 resources 文件夹中,别将 xml 文件放在 java 目录

  • 放在 java 目录下也不是不可以,对于 Maven 项目,可指定 POM 文件中的 resource

     <build>
       <resources>
           <resource>
               <!-- xml 放在 java 目录下,可以通过如下方法进行指定-->
               <directory>src/main/java</directory>
               <includes>
                   <include>**/*.xml</include>
               </includes>
           </resource>
       </resources>
     </build>
    

注意:如果 xml 文件放在 resources 下,则可以不用特定去指定。

结尾

最终,我还是将存放映射文件目录 xml 放到了 java 目录下,并通过在 POM 文件中重新指定 resource ,最终解决了这个 MMP 的 MP 异常问题

这个坑我先踩为敬,希望各位看后有所警醒,勿入,勿入啊!

撰文不易,欢迎大家点赞、评论,你的关注、点赞是我坚持的不懈动力,感谢大家能够看到这里!Peace & Love。

参考

简介 | MyBatis-Plus (baomidou.com)