Mybatis框架中的resultMap手动封装结果

resultMap是干什么用的?

当数据库字段和实体类字段不统一时,或者连表查询过多造成笛卡尔积超出内存的情况下可以使用resultMap手动封装结果

后者再开发中使用的频率高一些。实体字段一般与数据库字段都一一对应。

废话不多说直接上三个今天的主角

// 这是一张合作商表
public class Partner extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** 主键id */
    private Long id;

    /** 合作商名称 */
    @Excel(name = "合作商名称")
    private String partnerName;

    /** 联系人 */
    @Excel(name = "联系人")
    private String contactPerson;

    /** 联系电话 */
    @Excel(name = "联系电话")
    private String contactPhone;

    /** 分成比例 */
    @Excel(name = "分成比例")
    private Long profitRatio;

    /** 账号 */
    @Excel(name = "账号")
    private String account;
}
// 这是地区表
public class Region extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** 主键id */
    private Long id;

    /** 区域名称 */
    @Excel(name = "区域名称")
    private String regionName;
}
// 这是一张节点表
public class TbNode extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** 主键id */
    private Long id;

    /** 点位名称 */
    @Excel(name = "点位名称")
    private String nodeName;

    /** 详细地址 */
    @Excel(name = "详细地址")
    private String address;

    /** 商圈类型 */
    @Excel(name = "商圈类型")
    private Long businessType;

    /** 区域ID */
    @Excel(name = "区域ID")
    private Long regionId;

    /** 合作商ID */
    @Excel(name = "合作商ID")
    private Long partnerId;
}

这三张图的关系,每个区域拥有多个节点,每个合作商拥有多个节点
共有两个一对多的关系
前端需要返回节点信息,以及拥有当前节点的合作商和区域的名称信息

// 返回类型继承节点原有属性的基础上加上合作商和区域的属性
// 设备数量时和设备表关联查询得到
public class NodeVO extends TbNode {
    // 合作商
    private Partner partner;

    // 区域
    private Region region;

    // 设备数量
    private Integer vmCount;
}

xml文件

<select id="selectNodeVOList" resultMap="NodeVOResult"> <!-- 关联的resultMap -->
        select n.id, n.node_name, n.address, n.business_type, n.region_id, n.partner_id, n.create_time, n.update_time, n.create_by, n.update_by, n.remark, count(vm.id) as vmCount
        from tb_node n
        left join tb_vending_machine vm
        on n.id = vm.node_id
        <!-- 这里通过连表查询得到设备数量和节点信息 -->
        <where>
            <if test="nodeName != null  and nodeName != ''"> and node_name like concat('%', #{nodeName}, '%')</if>
            <if test="regionId != null "> and n.region_id = #{regionId}</if>
            <if test="partnerId != null "> and partner_id = #{partnerId}</if>
        </where>
        group by n.id
</select>
<!-- id是唯一表示用来指定使用的是哪一个resultMap    type 是封装的返回值类型 -->
<resultMap id="NodeVOResult" type="com.dkd.manage.domain.vo.NodeVO">
        <!-- id 表示主键  property 表示的是实体属性  column表示数据库字段  一一对应,每个实体属性所对应的数据库字段进行手动封装 -->
        <id property="id" column="id" />
        <!-- result 表示非主键字段 -->
        <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="vmCount" />
        <!-- association 表示封装 1对1 或 多对1 关系中的 1 -->
        <!-- property表示NodeVO中的属性region  javaType表示属性的类型  column 指定主查询结果中的哪一列(或哪些列)的值作为参数传递给 select 指定的子查询 select 表示查询所用的方法 一般再mapper层提前准备好 -->
        <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"  />
        <!-- 这个地方的javaType 不用写全类名,得益于再yaml文件中配置了mybatis的扫包路径 -->
       </resultMap>
# 这是有关mybatis的配置
# MyBatis配置
mybatis:
  # 搜索指定包别名
  typeAliasesPackage: com.dkd.**.domain
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # 加载全局的配置文件
  configLocation: classpath:mybatis/mybatis-config.xml
posted on 2026-06-15 13:04  转生成为全栈开发者  阅读(1)  评论(0)    收藏  举报