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 |