一、核心概念与适用场景
在 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"/>