ResultMap简介

简单介绍Mybatis中封装查询结果,什么时候用resultType,什么时候用resultMap

ResultMap简介

  • 什么时候用resultType?

如果查询返回的字段名与实体的属性名可以直接对应上,用resultType

  • 什么时候用resultMap?

如果查询返回的字段名与实体的属性名对应不上,或实体属性比较复杂,可以通过resultMap手动封装

例:

现有一个实体类Emp.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
@Data
public class Emp {
    private Integer id; //ID,主键
    private String username; //用户名
    private String password; //密码
    private String name; //姓名
    private Integer gender; //性别, 1:男, 2:女
    private String phone; //手机号
    private Integer job; //职位, 1:班主任,2:讲师,3:学工主管,4:教研主管,5:咨询师
    private Integer salary; //薪资
    private String image; //头像
    private LocalDate entryDate; //入职日期
    private Integer deptId; //关联的部门ID
    private LocalDateTime createTime; //创建时间
    private LocalDateTime updateTime; //修改时间

    // 封装部门名称
    private String deptName;
    // 封装工作经历信息
    private List<EmpExpr> exprList;
}

现在需要根据id查询员工信息及其工作经历信息,设计的mapper接口如下

1
Emp getById(Integer id);

对应的mapper映射文件如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<select id="getById" resultType="Emp">
    select e.*,
           ee.id ee_id,
           ee.begin ee_begin,
           ee.end ee_end,
           ee.company ee_company,
           ee.job ee_job
    from emp e left join emp_expr ee on e.id = ee.emp_id
    where e.id = #{id}
</select>

如果一个员工有多段工作经历就会报错,就算只有一段工作经历也会丢失,查询结果会为null

image-20250911210809245

所以此时就需要用到resultMap手动封装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<resultMap id="empResultMap" type="Emp">
    <!-- id标签装的是主键 -->
    <id property="id" column="id"/>
    <!-- result标签装普通属性 -->
    <result column="username" property="username" />
    <result column="password" property="password" />
    <result column="name" property="name" />
    <result column="gender" property="gender" />
    <result column="image" property="image" />
    <result column="entry_date" property="entryDate" />
    <result column="dept_id" property="deptId" />
    <result column="create_time" property="createTime" />
    <result column="update_time" property="updateTime" />
    <!-- 封装 exprList -->
    <!-- collection用来封装复杂属性,ofType指定集合中元素的类型,也就是集合泛型 -->
    <collection property="exprList" ofType="EmpExpr">
        <id column="ee_id" property="id"/>
        <result column="ee_company" property="company"/>
        <result column="ee_job" property="job"/>
        <result column="ee_begin" property="begin"/>
        <result column="ee_end" property="end"/>
        <result column="ee_empid" property="empId"/>
    </collection>
</resultMap>

<!-- 根据id查询员工基本信息及工作经历信息 -->
<select id="getById" resultMap="empResultMap">
    select e.*,
           ee.id ee_id,
           ee.begin ee_begin,
           ee.end ee_end,
           ee.company ee_company,
           ee.job ee_job
    from emp e left join emp_expr ee on e.id = ee.emp_id
    where e.id = #{id}
</select>

此时就可以正常查询到员工工作经历信息

本站于2025年3月26日建立
使用 Hugo 构建
主题 StackJimmy 设计