MyBatis 一对多映射的一个小坑

MyBatis一对多映射
本文介绍使用MyBatis进行一对多对象映射的方法,解决从数据库中同时获取City和Zone对象,并正确组装成City列表的问题。

下午写个报表,要那两个基础业务对象  city 和 zone,1:n,准备用MyBatis一对多映射,一次性获取,组装成 list of City,每个City对象中包含相应的Zone 列表


一开始的MyBatis配置如下:

<resultMap id="cityWithZone" type="City">
	<id property="id"/>
	<result property="name"/>
	<result property="active"/>
 	<collection property="zones" ofType="DeliveryZone" columnPrefix="zone_">
		<id property="id" column="id" />
		<result property="name" column="name"/>
		<result property="mode" column="mode"/>
		<result property="active" column="active"/>
	</collection>
</resultMap>

<select id="findAllActiveWithZone" resultMap="cityWithZone">
	SELECT
		C.id, C.name, C.active, 
		Z.id zone_id, Z.name zone_name, Z.active zone_active, Z.mode zone_mode
	FROM t_delivery_zone Z left outer join t_city C on Z.city_id=C.id 
	WHERE Z.active='Y' and C.active='Y'
	ORDER BY C.sort_no desc
</select>

数据库中有符合条件的 City 5个,Zone 22个,这样只能得到一个size为22的列表,每个对象都是空。


最后发现,在这种情况下,必须显式指定 column 的名字,即使它和property的名字完全相同:

<resultMap id="cityWithZone" type="City">
	<id property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="active" column="active"/>
	<collection property="zones" ofType="DeliveryZone" columnPrefix="zone_">
		<id property="id" column="id" />
		<result property="name" column="name"/>
		<result property="mode" column="mode"/>
		<result property="active" column="active"/>
	</collection>
</resultMap>

黄鹤 2015-05-11

<think>嗯,用户这次想了解MyBatis-Plus中mapper-locations配置个路径的具体方法和注意事项。从用户提供的引用资料来看,用户应该是个Java开发者,可能在使用MyBatis-Plus时遇到了路径配置的问题。 用户可能是从某个教程或者文档中看到了相关配置,但对具体细节不太清楚。考虑到用户引用了四篇相关文章,特别是引用[3]明确提到了路径配置的示例,这说明用户已经做过一些调研,现在需要更系统性的解答。 在技术细节上,我需要重点说明两点:一是路径配置的语法格式,这在引用[3]的yml配置示例中展示得很清楚;二是路径匹配规则,特别是classpath和classpath*的区别,这是容易踩坑的地方。用户提供的引用[4]提到配置失效的问题,正好可以用来提醒注意事项。 用户可能还隐含想知道如何验证配置是否生效,所以需要补充单元测试的方法。引用[1]和[2]提到的starter依赖差异也很重要,不同依赖会导致配置前缀不同,这个坑必须强调。 回复结构应该这样组织:先给出标准的路径配置示例(yml和properties两种格式),然后解释路径匹配规则,接着重点说明注意事项,最后给个验证方案。注意事项部分要把依赖差异、通配符使用、路径重叠这些关键点都覆盖到。 值得一提的是,用户引用的资料里有篇原文链接是收费提示,说明用户可能遇到资料获取障碍,所以回答时要尽量把核心内容解释透彻,避免让用户再去查找碎片化资料。 </think>在 MyBatis-Plus 中配置个 `mapper-locations` 路径用于扫描 XML 映射文件是常见需求,以下是详细方法和注意事项: --- ### **一、配置个路径的方法** 在 `application.yml` 或 `application.properties` 中,使用数组形式列出个路径即可。 #### **1. YAML 格式配置** ```yaml mybatis-plus: mapper-locations: - classpath:mapper/module1/**/*.xml - classpath:mapper/module2/**/*.xml - classpath*:com/example/custom/**/*Mapper.xml ``` #### **2. Properties 格式配置** ```properties # 个路径用逗号分隔 mybatis-plus.mapper-locations=\ classpath:mapper/module1/**/*.xml,\ classpath:mapper/module2/**/*.xml,\ classpath*:com/example/custom/**/*Mapper.xml ``` --- ### **二、关键注意事项** 1. **依赖差异导致的前缀问题** - **依赖 `mybatis-plus-boot-starter`** → 使用 `mybatis-plus.mapper-locations` - **依赖原生 `mybatis-plus`** → 使用 `mybatis.mapper-locations` *配置错误会导致 XML 文件无法加载*[^1][^2]。 2. **`classpath` vs `classpath*`** - `classpath:`:仅扫描当前模块的类路径(不包含依赖 Jar 包)。 - `classpath*:`:扫描所有模块(含依赖 Jar 包)的类路径。 *模块项目或依赖第三方 Mapper 时需用 `classpath*:`*[^3]。 3. **通配符规则** - 单级目录:`*`(如 `mapper/*.xml`) - 级目录:`**`(如 `mapper/**/*.xml`) 4. **路径重叠问题** - 避免路径重复包含(如 `mapper/**/*.xml` 和 `mapper/user/*.xml` 可能导致重复加载)。 5. **Nacos 配置中心兼容性** - 在 Nacos 中配置时,确保 `mapper-locations` 的缩进正确(YAML 需对齐),否则配置无效[^4]。 6. **路径大小写敏感** - **Linux 系统路径区分大小写**,需确保配置路径与实际目录大小写一致。 --- ### **三、验证配置是否生效** 1. 开启 MyBatis-Plus SQL 日志: ```yaml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 2. 执行单元测试,检查日志: - 若出现 `Mapped Statements` 加载数量,表示配置成功。 - 若提示 `BindingException: Invalid bound statement`,需检查路径匹配规则。 --- ### **四、典型问题排查** | **现象** | **解决方案** | |-------------------------|---------------------------------------| | XML 文件未被加载 | 检查依赖前缀、路径通配符、文件后缀 | | 模块扫描失败 | 使用 `classpath*:` 替代 `classpath:` | | Nacos 配置不生效 | 确认 YAML 缩进与本地配置一致[^4] | | 日志无 SQL 输出 | 检查 `log-impl` 配置是否开启 | --- ### **配置示例对比** ```yaml # ✅ 正确配置(路径 + classpath*) mybatis-plus: mapper-locations: - classpath:mapper/**/*.xml - classpath*:com/lib/**/*Mapper.xml # ❌ 错误配置(路径未用数组格式) mybatis-plus.mapper-locations=classpath:mapper/*.xml, classpath:com/*/mapper/*.xml ``` > **总结**:路径配置需注意 **依赖前缀**、**路径匹配规则** 和 **通配符语法**,尤其在模块或云配置环境下需严格验证路径有效性。建议通过单元测试和日志输出双重验证[^1][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值