MyBatis 连表查询优化:用 resultMap + autoMapping 绑定嵌套查询对象

本文带你从零实现一个典型的 商品分组 + 属性项 连表查询,并通过 resultMapautoMapping="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 → attrGroupIdvalue_select → valueSelect,完美匹配

✅ 只要数据库字段名和 Java 属性名遵循 下划线 ↔ 驼峰 转换规则,就能自动匹配!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值