初识手动结果集映射 (ResultMap)

15 阅读2分钟

1. 为什么要“手动封装”?(麻烦出在哪里)

你看一眼你刚才查出来的 SQL 结果(数据库给你的东西):

它像一张 Excel 表格。

  • 因为你用了连接查询 (Left Join),如果“张三”有 3 段工作经历,数据库就会给你 3 行数据
  • 这 3 行里,“张三”的名字、ID 是重复的,只有“工作经历”那几列不一样。

但是,你在 Java 里想要的是什么?

你只想要 1 个 “张三”对象(一个行李箱)。

在这个箱子里,有一个清单 (List),上面写着那 3 段经历。

矛盾点: 数据库给你 3 个散件,你要把它们自动打包成 1 个箱子。机器太笨,不会自己打包,所以你需要写 resultMap 教它。


2. 手把手教你怎么写这个“打包说明书”

我们看着你提供的代码图片,把你写的 XML 拆成三个简单的指令:

第一条指令:<id> —— “认主人的”

XML

<id column="id" property="id"/>
  • 这是最重要的去重开关。
  • 含义:告诉 MyBatis,“只要看到 id 列是 1,这就都是‘张三’的东西,别给我创建三个张三,只要创建一个!”
  • 如果没有这一行,MyBatis 就会傻乎乎地给你搞出 3 个一模一样的张三对象。

第二条指令:<result> —— “填基本信息的”

XML

<result column="username" property="username"/>
...
  • 含义:这很简单。就是把数据库里的名字、年龄,填到张三这个对象对应的格子里。

第三条指令:<collection> —— “往兜里塞东西的”

XML

<collection property="exprList" ofType="...EmpExpr">
    <id column="ee_id" property="id"/>
    <result column="ee_company" property="company"/>
</collection>
  • 这是处理那 3 段经历的关键。

  • 含义

    1. property="exprList" :告诉 MyBatis,“接下来的数据,不要直接放在张三手里,要放进他那个叫 exprList 的**口袋(List)**里。”
    2. ofType:告诉 MyBatis,“这个口袋里装的是 EmpExpr 类型的对象。”
    3. 里面的 <result> :把那 3 行不一样的“公司名”、“职位”数据,一条条做成小卡片,塞进这个口袋里。

3. 极简总结

你只需要记住两点:

  1. <id> 标签:负责把 3 行数据合并成 1 个人(去重)。
  2. <collection> 标签:负责把这 3 行里不一样的数据,收集到一个 List 列表里。

只要配置好这两个,MyBatis 就能自动帮你把“平铺的表格”变成“立体的对象”。