问题描述
单元测试
这里测试的是自定义的 SQL 语句,根据 id 获取对应实体对象。
报错显示
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 文件)。
问题解决
通过检查上述配置,发现没有任何毛病问题,不管是@MapperScan 注解还是 @TableId(value = "fruit_id" type = IdType.AUTO) 注解的添加,都无济于事,直到我将 xml 目录从 java 文件夹下移入到 resources 目录下,再次修改 yaml 配置文件中 mapper-locations 属性,回到 SpringBoot 测试类中单击倒三角运行图标,竟然惊喜地发现成功通过了测试。
原来是对于 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。