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
浙公网安备 33010602011771号