MyBatis的ResultType和ResultMap的区别?
...大约 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"表示将查询结果的id、name、age列直接映射到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_id | user_name | age | order_id | order_name | 
|---|---|---|---|---|
| 1 | Alice | 25 | 101 | Order A | 
| 1 | Alice | 25 | 102 | Order B |