MyBatis 中的 resultType 与 resultMap:区别、使用场景及示例详解

MyBatis中resultType与resultMap详解

在使用 MyBatis 进行数据库操作时,我们经常需要将查询结果映射到 Java 对象中。MyBatis 提供了两种主要的方式来进行结果映射:resultType 和 resultMap。本文将详细介绍这两者的区别、适用场景,并通过代码示例帮助你更好地理解和应用。

一、什么是 resultType

1. 定义

resultType 是 MyBatis 中用于指定 SQL 查询结果直接映射为 Java 类型(如实体类、基本类型或 Map)的属性。

2. 特点

适用于简单查询,字段名与目标类的属性名一一对应。

自动完成映射,无需手动配置。

支持常见的 Java 类型:

    1. 基本数据类型(int、String 等)
    2. Java Bean(POJO)
    3. Map(返回结果以 key-value 形式存储)
3. 使用场景

单表查询,列名和 POJO 字段一致。

返回值为单个对象或集合。

不涉及复杂关联映射(如多对一、一对多等)。

4. 示例
示例 1:返回一个实体类对象
<select id="getUserById" resultType="com.example.model.User">
    SELECT * FROM user WHERE id = #{id}
</select>
对应的 Java 类:
public class User {
    private int id;
    private String name;
    private String email;

    // getters and setters
}
示例 2:返回 Map 集合
<select id="getUserMap" resultType="map">
    SELECT id, name FROM user
</select>
返回的每个记录是一个 Map<String, Object>,例如:
{id=1, name="张三"}

二、什么是 resultMap

1. 定义

resultMap 是 MyBatis 中用于定义自定义映射关系的标签。它允许开发者手动指定数据库列与 Java 对象属性之间的映射规则。

2. 特点

可处理复杂的映射关系(如字段不一致、嵌套对象、关联查询等)。

更加灵活,但需要手动编写映射配置。

支持延迟加载、联合查询、继承等高级特性。

3. 使用场景

数据库列名与 Java 属性名不一致。

多表联查,返回包含多个对象的数据结构。

一对多、多对一等关联关系映射。

需要复用映射逻辑

4. 示例
示例 1:基础字段映射
<resultMap id="userResultMap" type="com.example.model.User">
    <id property="id" column="user_id"/>
    <result property="name" column="user_name"/>
    <result property="email" column="user_email"/>
</resultMap>

<select id="getAllUsers" resultMap="userResultMap">
    SELECT user_id, user_name, user_email FROM user
</select>
示例 2:嵌套对象映射(一对一)

假设有一个 User 对应一个 Address:

public class Address {
    private String city;
    private String street;
    // getters and setters
}

public class User {
    private int id;
    private String name;
    private Address address;
    // getters and setters
}
XML 映射如下:
<resultMap id="userWithAddressResultMap" type="com.example.model.User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <association property="address" javaType="com.example.model.Address">
        <result property="city" column="city"/>
        <result property="street" column="street"/>
    </association>
</resultMap>

<select id="getUserWithAddress" resultMap="userWithAddressResultMap">
    SELECT u.id, u.name, a.city, a.street
    FROM user u
    LEFT JOIN address a ON u.address_id = a.id
</select>
示例 3:一对多映射(用户与订单)
public class Order {
    private int orderId;
    private double amount;
    // getters and setters
}

public class User {
    private int id;
    private String name;
    private List<Order> orders;
    // getters and setters
}
XML 映射如下:
<resultMap id="userWithOrdersResultMap" type="com.example.model.User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="orders" ofType="com.example.model.Order">
        <result property="orderId" column="order_id"/>
        <result property="amount" column="amount"/>
    </collection>
</resultMap>

<select id="getUserWithOrders" resultMap="userWithOrdersResultMap">
    SELECT u.id, u.name, o.order_id, o.amount
    FROM user u
    LEFT JOIN orders o ON u.id = o.user_id
</select>

三、resultType 与 resultMap 的对比总结

对比项

resultType

resultMap

是否需要手动配置

映射方式

自动匹配字段名

手动指定映射关系

适用场景

简单查询,字段一致

复杂查询,字段不一致、嵌套对象、关联查询等

性能

稍快

稍慢(需解析映射关系)

可读性与可维护性

简洁易懂

更复杂,但更灵活

四、何时使用 resultType?何时使用 resultMap?

场景

推荐使用

单表查询,字段名与 Java 属性一致

resultType

返回基本类型(如 Integer、String

resultType

返回 Map 类型

resultType

字段名与 Java 属性名不一致

resultMap

包含嵌套对象或集合

resultMap

多表联查返回复杂结构

resultMap

需要复用映射逻辑

resultMap

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值