在使用 MyBatis 进行数据库操作时,我们经常需要将查询结果映射到 Java 对象中。MyBatis 提供了两种主要的方式来进行结果映射:resultType 和 resultMap。本文将详细介绍这两者的区别、适用场景,并通过代码示例帮助你更好地理解和应用。
一、什么是 resultType
1. 定义
resultType 是 MyBatis 中用于指定 SQL 查询结果直接映射为 Java 类型(如实体类、基本类型或 Map)的属性。
2. 特点
适用于简单查询,字段名与目标类的属性名一一对应。
自动完成映射,无需手动配置。
支持常见的 Java 类型:
-
- 基本数据类型(int、String 等)
- Java Bean(POJO)
- 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 |
MyBatis中resultType与resultMap详解
2992

被折叠的 条评论
为什么被折叠?



