出现这个问题的根本原因就是mybatis 的mapper类和 mapper.xml文件对应不上,可能是namespace找不到,也可能是mapper文件找不到
- 检查xml文件所在package名称是否和Mapper interface所在的包名
<mapper namespace="com.xxx.xxx.dao.xxxx DAO">
检查这里配置的namespace和代码中定义的 mapper interface 是否一样
package com.xxx.xxx.dao.;
public interface XXXDAO
- 如何第一步没有问题,检查是否是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文件
网友评论