mybatis中的<association/> -2025/7/10

介绍

<association></association> 是 MyBatis 中用于处理 一对一关联映射 的标签,主要用于将数据库查询结果映射到 Java 对象的复杂属性(如嵌套对象)。以下是其核心用法和注意事项:

核心作用

当实体类中包含另一个对象的引用时(例如 Node 类包含 Region 对象),使用 <association> 可以将多表查询的结果映射到嵌套对象中。

关键属性

  1. property:Java 对象中的属性名。
  2. column:数据库表中的列名(或列别名)。
  3. javaType:属性的类型(全限定类名或别名)。
  4. select:引用另一个 SQL 查询的 ID,用于嵌套查询。
  5. resultMap:引用另一个 ResultMap 的 ID,用于嵌套映射。

使用

例如有个 NodeVo 属性为

@Data
public class NodeVo extends Node {
//    设备数
    private Integer vmCount;

    private Region region;

    private Partner partner;
}

查询的sql为

SELECT
            n.*,
            COUNT(vm.id) AS vm_count
        FROM
            tb_node n
                LEFT JOIN
            tb_vending_machine vm ON n.id = vm.node_id
        <where>
            <if test="nodeName != null  and nodeName != ''"> and n.node_name like concat('%', #{nodeName}, '%')</if>
            <if test="regionId != null "> and n.region_id = #{regionId}</if>
        </where>
        GROUP BY
            n.id, n.node_name

但是这样知识查询到了 region_id 和 partern_id

并不能通过mybatis的自动装配 来赋值给 NodeVo

这时候 需要自定义一个 ResultMap 使用到了 <association>

<resultMap id="NodeVoResult" type="NodeVo">
        <result property="id"    column="id"    />
        <result property="nodeName"    column="node_name"    />
        <result property="address"    column="address"    />
        <result property="businessType"    column="business_type"    />
        <result property="regionId"    column="region_id"    />
        <result property="partnerId"    column="partner_id"    />
        <result property="createTime"    column="create_time"    />
        <result property="updateTime"    column="update_time"    />
        <result property="createBy"    column="create_by"    />
        <result property="updateBy"    column="update_by"    />
        <result property="remark"    column="remark"    />
        <result property="vmCount"    column="vm_count"    />
        <association property="region" javaType="Region" column="region_id" select="com.dkd.manage.mapper.RegionMapper.selectRegionById"/>
        <association property="partner" javaType="Partner" column="partner_id" select="com.dkd.manage.mapper.PartnerMapper.selectPartnerById"/>
    </resultMap>

此时 查询 NodeVo的 xml 应该这样写

<select id="selectNodeVoList" resultMap="NodeVoResult">
        SELECT
            n.*,
            COUNT(vm.id) AS vm_count
        FROM
            tb_node n
                LEFT JOIN
            tb_vending_machine vm ON n.id = vm.node_id
        <where>
            <if test="nodeName != null  and nodeName != ''"> and n.node_name like concat('%', #{nodeName}, '%')</if>
            <if test="regionId != null "> and n.region_id = #{regionId}</if>
        </where>
        GROUP BY
            n.id, n.node_name
    </select>

经过这样的操作 便可得到完整的 List<NodeVo> 涉及到了四张表的查询 如果直接写嵌套查询 还是比较麻烦的

** 与之对应的有 <collection> **

<association> 是 一对一时候用到

<collectio> 是 一对多

posted @ 2025-07-29 20:53  XYu1230  阅读(169)  评论(0)    收藏  举报