在学习、面试、工作中的题型知识,MyBatis 的 ResultMap 是 MyBatis 中用于处理数据库查询结果与 Java 对象之间映射的一个重要配置。它的作用是帮助 MyBatis 将数据库查询返回的结果集(ResultSet)按照指定的规则映射到 Java 对象(POJO)中,解决字段名和对象属性名不同或复杂对象嵌套的问题。
1. 为什么需要 ResultMap?
- 字段名与对象属性名不同
数据库的字段名可能是下划线命名(如user_name
),但 Java 对象的属性名可能是驼峰命名(如userName
)。MyBatis 默认是通过属性名与字段名自动映射,但在命名不一致或复杂对象时就需要 ResultMap 进行手动配置。 - 对象中包含嵌套对象
比如查询结果中包含了用户的基本信息和所属部门的信息,这时候需要通过 ResultMap 处理嵌套对象的映射。 - 处理复杂的 SQL 结果
复杂查询(如连接查询)可能返回多个表的字段,ResultMap 允许通过配置将这些字段映射到不同的对象中。
2. ResultMap 的基本用法
① 定义简单映射
当数据库字段名与 Java 对象属性名不同,需要手动指定映射关系。
<resultMap id="userResultMap" type="com.example.User">
<id property="id" column="user_id"/>
<result property="userName" column="user_name"/>
<result property="age" column="user_age"/>
</resultMap>
<select id="getUserById" resultMap="userResultMap">
SELECT user_id, user_name, user_age FROM users WHERE user_id = #{id}
</select>
id
元素:用于标识主键映射result
元素:用于普通字段映射column
:对应数据库字段名property
:对应 Java 对象的属性名
② 处理嵌套对象映射
假设查询结果中包含用户信息和部门信息:
<resultMap id="userResultMap" type="com.example.User">
<id property="id" column="user_id"/>
<result property="userName" column="user_name"/>
<association property="department" javaType="com.example.Department">
<id property="id" column="dept_id"/>
<result property="name" column="dept_name"/>
</association>
</resultMap>
<select id="getUserWithDepartment" resultMap="userResultMap">
SELECT u.user_id, u.user_name, d.dept_id, d.dept_name
FROM users u
LEFT JOIN department d ON u.dept_id = d.dept_id
WHERE u.user_id = #{id}
</select>
association
用于处理一对一关系collection
可用于处理一对多或多对多关系
③ 处理一对多映射
假设一个用户可以有多个订单:
<resultMap id="userResultMap" type="com.example.User">
<id property="id" column="user_id"/>
<result property="userName" column="user_name"/>
<collection property="orders" ofType="com.example.Order">
<id property="id" column="order_id"/>
<result property="product" column="product_name"/>
<result property="amount" column="amount"/>
</collection>
</resultMap>
<select id="getUserWithOrders" resultMap="userResultMap">
SELECT u.user_id, u.user_name, o.order_id, o.product_name, o.amount
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
WHERE u.user_id = #{id}
</select>
collection
用于处理一对多或多对多关系ofType
定义集合中每个对象的类型
3. ResultMap 的优势
✅ 解决字段名与属性名不一致问题
✅ 支持复杂对象(如嵌套对象和集合)
✅ 提供灵活的 SQL 结果集映射
✅ 易于扩展和维护
4. 总结
ResultMap 是 MyBatis 中非常强大的特性,它让 SQL 查询返回的结果与 Java 对象之间的映射更加灵活和可控,尤其是在涉及多表查询、嵌套对象以及复杂结果集时,ResultMap 可以显著简化代码和配置。