目录
一、什么是 resultType
1. 定义
2. 特点
3. 使用场景
4. 示例
示例 1:返回一个实体类对象
对应的 Java 类:
示例 2:返回 Map 集合
返回的每个记录是一个 Map,例如:
二、什么是 resultMap
1. 定义
2. 特点
3. 使用场景
4. 示例
示例 1:基础字段映射
示例 2:嵌套对象映射(一对一)
XML 映射如下:
示例 3:一对多映射(用户与订单)
XML 映射如下:
三、resultType 与 resultMap 的对比总结
四、何时使用 resultType?何时使用 resultMap?
在使用 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.streetFROM user uLEFT 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.amountFROM user uLEFT 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 |