本文带你从零实现一个典型的 商品分组 + 属性项 连表查询,并通过
resultMap
和autoMapping="true"
大幅简化 XML 配置,告别重复劳动。
🎯 需求场景
查询多个属性分组(AttrGroup
)及其关联的属性列表(AttrItem
),返回结构如下:
[
{
"attrGroupId": 1,
"attrGroupName": "外观",
"catelogId": 225,
"sort": 1,
"descript": "外观相关属性",
"attrItemList": [
{ "attrId": 101, "attrName": "颜色", "valueSelect": "红,蓝,黑", "valueType": 1 },
{ "attrId": 102, "attrName": "尺寸", "valueSelect": "S,M,L", "valueType": 1 }
]
}
]
🧱 BO 对象设计(含嵌套类)
@Data
public class PmsAttrGroupAttrBO {
private Long attrGroupId;
private String attrGroupName;
private Long catelogId;
private Integer sort;
private String descript;
private List<AttrItem> attrItemList;
@Data
public static class AttrItem {
private Long attrId;
private String attrName;
private String valueSelect;
private Integer valueType;
}
}
注意:嵌套类必须是
static
,否则 MyBatis 无法实例化。
SQL 查询
<select id="listAttrByGroupIds" resultMap="pmsAttrGroupAttrBOMap">
SELECT
a.attr_group_id, a.attr_group_name, a.sort, a.descript, a.catelog_id,
b.attr_id, b.attr_name, b.value_select, b.value_type
FROM pms_attr_group a
LEFT JOIN pms_attr_attrgroup_relation r ON a.attr_group_id = r.attr_group_id
LEFT JOIN pms_attr b ON b.attr_id = r.attr_id
WHERE a.attr_group_id IN
<foreach collection="attrGroupIdList" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</select>
🐛 原始写法:手动映射每一个字段(冗余且易错)
<resultMap type="com.atguigu.gulimall.product.dto.attrGroup.bo.PmsAttrGroupAttrBO" id="pmsAttrGroupAttrBOMap">
<result property="attrGroupId" column="attr_group_id"/>
<result property="attrGroupName" column="attr_group_name"/>
<result property="sort" column="sort"/>
<result property="descript" column="descript"/>
<result property="catelogId" column="catelog_id"/>
<collection property="attrItemList" ofType="com.atguigu.gulimall.product.dto.attrGroup.bo.PmsAttrGroupAttrBO$AttrItem">
<result property="attrId" column="attr_id"/>
<result property="attrName" column="attr_name"/>
<result property="valueSelect" column="value_select"/>
<result property="valueType" column="value_type"/>
</collection>
</resultMap>
❌ 痛点:
- 每个字段都要手动写一遍,重复、枯燥、易遗漏
- 字段名变更时,XML 和 Java 类需同步修改,维护成本高
- 可读性差,一眼看不出映射关系
✅ 优化方案:启用 autoMapping
,让 MyBatis 自动绑定!
✅ 优化后的 resultMap
<resultMap type="com.atguigu.gulimall.product.dto.attrGroupAttrBO.PmsAttrGroupAttrBO"
id="pmsAttrGroupAttrBOMap"
autoMapping="true">
<collection property="attrItemList"
ofType="com.atguigu.gulimall.product.dto.attrGroupAttrBO.PmsAttrGroupAttrBO$AttrItem"
autoMapping="true">
</collection>
</resultMap>
🔍 autoMapping
是如何工作的?
特性 | 说明 |
---|---|
autoMapping="true" | 开启自动映射:MyBatis 会自动将 column (下划线)映射到 property (驼峰命名) |
支持嵌套 | 在 <collection> 中也可开启 autoMapping ,自动映射子对象 |
规则匹配 | attr_group_id → attrGroupId ,value_select → valueSelect ,完美匹配 |
✅ 只要数据库字段名和 Java 属性名遵循 下划线 ↔ 驼峰 转换规则,就能自动匹配!