mybatis中的<association/> -2025/7/10
介绍
<association></association> 是 MyBatis 中用于处理 一对一关联映射 的标签,主要用于将数据库查询结果映射到 Java 对象的复杂属性(如嵌套对象)。以下是其核心用法和注意事项:
核心作用
当实体类中包含另一个对象的引用时(例如 Node 类包含 Region 对象),使用 <association> 可以将多表查询的结果映射到嵌套对象中。
关键属性
property:Java 对象中的属性名。column:数据库表中的列名(或列别名)。javaType:属性的类型(全限定类名或别名)。select:引用另一个 SQL 查询的 ID,用于嵌套查询。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> 是 一对多

浙公网安备 33010602011771号