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 段经历的关键。
-
含义:
property="exprList":告诉 MyBatis,“接下来的数据,不要直接放在张三手里,要放进他那个叫exprList的**口袋(List)**里。”ofType:告诉 MyBatis,“这个口袋里装的是EmpExpr类型的对象。”- 里面的
<result>:把那 3 行不一样的“公司名”、“职位”数据,一条条做成小卡片,塞进这个口袋里。
3. 极简总结
你只需要记住两点:
<id>标签:负责把 3 行数据合并成 1 个人(去重)。<collection>标签:负责把这 3 行里不一样的数据,收集到一个 List 列表里。
只要配置好这两个,MyBatis 就能自动帮你把“平铺的表格”变成“立体的对象”。