在学习、面试、工作中的题型知识,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 可以显著简化代码和配置。