深入理解 mapper-locations
mybatis-plus.mapper-locations: classpath*:/mapper/**/*.xml
是 MyBatis/MyBatis-Plus 在 Spring Boot 配置文件(如 application.yml
或 application.properties
)中的一项关键配置,用于指定 MyBatis Mapper XML 文件的存放路径。以下是详细解释:
1. 配置含义
mybatis-plus:mapper-locations: classpath*:/mapper/**/*.xml
-
作用:告诉 MyBatis/MyBatis-Plus 去哪里扫描并加载 SQL 映射文件(即
*Mapper.xml或者
*Dao.xml
文件)。 -
值解析:
-
classpath*:
:从所有类路径(包括依赖的 JAR 文件)中搜索。 -
/mapper/**/*.xml
:匹配resources/mapper/
目录及其子目录下的所有.xml
文件。
-
2. 为什么需要这个配置?
-
默认行为:
MyBatis 默认会尝试加载与 Mapper 接口同名的 XML 文件(如UserDao.java
对应UserDao.xml
),但需要明确指定 XML 的存放路径。 -
灵活定位:
如果你的 XML 文件不放在默认位置(如resources/com/example/dao/
),需要通过此配置自定义路径。
3. 常见配置示例
(1) 多路径匹配
mybatis-plus:mapper-locations: - classpath*:/mapper/**/*.xml- classpath*:/com/example/custom/**/*.xml
支持多个路径,用列表形式表示。
(2) 不同项目结构
-
如果 XML 文件直接放在
resources/mapper/
下:
mybatis-plus:mapper-locations: classpath*:mapper/*.xml
- 如果 XML 文件按模块分包:
mybatis-plus:mapper-locations: classpath*:com/example/**/dao/*.xml
4. 与 @MapperScan
的关系
-
mapper-locations
:告诉 MyBatis XML 文件在哪里。 -
@MapperScan
:告诉 Spring Mapper 接口在哪里(扫描 DAO 接口)。
两者需配合使用,例如:
@SpringBootApplication
@MapperScan("com.example.dao") // 扫描接口
public class App {}
mybatis-plus:mapper-locations: classpath*:com/example/dao/*.xml # 扫描 XML
5. 注意事项
-
路径通配符:
-
**
:匹配多级目录(如mapper/user/UserMapper.xml
)。 -
*
:匹配单级目录或文件名(如mapper/*.xml
)。
-
-
文件命名:
-
XML 文件名通常与 Mapper 接口名一致(如
UserMapper.java
对应UserMapper.xml
)。
-
-
优先级:
-
如果同时存在注解(如
@Select
)和 XML,XML 优先级更高。
-
-
资源过滤:
-
确保 Maven 将 XML 文件复制到
target/classes
或构建输出目录。
-
6. 如何验证配置生效?
-
检查日志:
启动时查看 MyBatis 日志,是否加载了预期的 XML 文件:
[MyBatis] Mapped SQL statement: com.example.dao.UserMapper.selectById
-
解压 JAR 检查:
打包后解压 JAR,确认 XML 文件在指定路径下(如BOOT-INF/classes/mapper/UserMapper.xml
)。 -
故意写错路径:
修改为一个不存在的路径(如classpath*:/nonexist/**/*.xml
),如果启动时报BindingException
,说明原配置已生效。