MyBatis的ResultType和ResultMap的区别?

tim-qtp...大约 1 分钟MyBatis

  • resultType:适合简单的映射场景,列名和属性名一致时使用。
  • resultMap:适合复杂的映射场景,列名和属性名不一致或需要处理嵌套对象、集合时使用。

resultType示例:

假设有一个 User 类:

public class User {
    private Long id;
    private String name;
    private Integer age;
    // getter 和 setter 方法
}

查询语句:

<select id="getUserById" resultType="User">
    SELECT id, name, age FROM user WHERE id = #{id}
</select>
  • 这里 resultType="User" 表示将查询结果的 idnameage 列直接映射到 User 对象的属性上。

resultMap示例:

假设有一个 User 类和一个 Order 类:

public class User {
    private Long id;
    private String userName; // 注意:属性名是 userName,而数据库列名是 name
    private Integer age;
    private List<Order> orders; // 嵌套的订单列表
    // getter 和 setter 方法
}

public class Order {
    private Long orderId;
    private String orderName;
    // getter 和 setter 方法
}

定义 resultMap

<resultMap id="UserResultMap" type="User">
    <!-- 主键映射 -->
    <id property="id" column="id" />
    <!-- 普通字段映射 -->
    <result property="userName" column="name" /> <!-- 列名 name 映射到属性 userName -->
    <result property="age" column="age" />
    <!-- 嵌套集合映射 -->
    <collection property="orders" ofType="Order">
        <id property="orderId" column="order_id" />
        <result property="orderName" column="order_name" />
    </collection>
</resultMap>

查询语句:

<select id="getUserById" resultMap="UserResultMap">
    SELECT 
        u.id, 
        u.name, 
        u.age, 
        o.order_id, 
        o.order_name
    FROM user u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE u.id = #{id}
</select>
  • 这里 resultMap="UserResultMap" 表示使用自定义的映射规则。
  • resultMap 可以处理列名和属性名不一致的情况,还可以映射嵌套的 orders 集合。

注意

虽然sql语句返回的结果是这个,但是MyBatis 根据 resultMap 将查询的多行原始结果组装成自定义的 Java 对象结构,而不是直接返回查询的表格形式。

user_iduser_nameageorder_idorder_name
1Alice25101Order A
1Alice25102Order B