一、核心概念与适用场景
在 MyBatis 中,<association>
和 <collection>
用于处理对象间的关联关系,简化复杂查询到对象结构的映射。
标签 |
用途 |
对应关系 |
示例场景 |
<association> |
映射 单个嵌套对象(“有一个”关系) |
一对一、多对一 |
员工 (Emp) 属于一个部门 (Dept) |
<collection> |
映射 集合属性(“有多个”关系) |
一对多、多对多 |
用户 (User) 拥有多个角色 (Role) |
二、标签属性详解
1. <association>
属性
属性名 |
必填 |
说明 |
property |
是 |
POJO 中的属性名(如 Emp.dept )。 |
javaType |
否 |
关联对象的完整类名(如 cn.cjxy.domain.Dept ),通常 MyBatis 可自动推断。 |
resultMap |
否 |
引用外部已定义的 ResultMap,适合复用映射规则。 |
column |
否 |
当前查询中作为关联子查询参数的列名(格式 {prop=col1, prop2=col2} ),适用于嵌套查询方式。 |
select |
否 |
指向另一个 <select> 的 ID,用于延迟加载关联对象(需配置懒加载)。 |
2. <collection>
属性
属性名 |
必填 |
说明 |
property |
是 |
POJO 中的集合属性名(如 User.roles )。 |
ofType |
是 |
集合元素的完整类名(如 cn.cjxy.domain.Role )。 |
resultMap |
否 |
引用外部 ResultMap。 |
column |
否 |
传递到嵌套查询的参数列,类似 <association> 。 |
select |
否 |
执行嵌套查询的 <select> ID。 |
三、实战对比:用户代码解析与优化
**1. 代码1 (UserMapper.xml):多角色查询(一对多)
<resultMap id="userResultMap" type="User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<collection property="roles" ofType="Role">
<result column="id" property="roleId"/>