MyBatis: Invalid bound statement (not found)

出现这个问题的根本原因就是mybatis 的mapper类和 mapper.xml文件对应不上,可能是namespace找不到,也可能是mapper文件找不到

  1. 检查xml文件所在package名称是否和Mapper interface所在的包名

检查这里配置的namespace和代码中定义的 mapper interface 是否一样

package com.xxx.xxx.dao.;
public interface XXXDAO
  1. 如何第一步没有问题,检查是否是mapper文件没有扫描到导致的
    单模块项目:
    检查配置文件中的mybatis.mapper-locations是否配置正确
mybatis.mapper-locations=com.xxx.xxx.dao

多模块项目:
在模块A中,只完成了mybatis mapper interface 的定义和 mapper的实现没有定义mybatis的数据源,和配置
在模块B 中,通过pom 引用A 模块。
在这种结构下如果出现了Invalid bound statement, 我们就需要修改mapper-locations 的值为:

classpath*:mapper/*.xml

因为:A 模块被引入后,A 模块的mapper文件不会被引入到resources/mapper目录下,而是引入到了resources root目录下,所以如果只配置classpath:mapper/.xml,会导致mybatis在B模块下读取不到A模块的mapper文件,因为 classpath:只会到你的class路径中查找找文件,当有多个classpath路径只会从第一个classpath中加载。
classpath
:不仅包含class路径,还包括jar文件中(class路径)进行查找;当有多个classpath路径,会从所有的classpath中加载;

【注】用classpath:需要遍历所有的classpath,所以加载速度是很慢的;因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用classpath

今天遇到了更怪的项目:
B模块用的是mybatis plus, A模块用的mybatis,
Step 1: 当时想的mybatis plus 底层就是mybatis, 所以直接在配置文件中添加了如下配置:

mybatis.mapper-locations=com.xxx.xxx.dao

这样application.properties的配置如下:

mybatis.mapper-locations= classpath:mapper/*xml
mybatis-plus.mapper-locations= classpath*: mapper/*.xml

启动时发现还是报错,所以猜想应该是mybatis, mybatis-plus冲突导致的。

Step2:只保留mybatis.mapper-locations一个,配置如下

mybatis.mapper-locations= classpath*:mapper/*xml

或只保留

mybatis-plus.mapper-locations= classpath*:mapper/*xml

启动发现,正确获取了mapper文件

你可能感兴趣的:(MyBatis: Invalid bound statement (not found))