MyBatis中resultMap的作用及用法
一、作用
- 字段名与属性名映射
解决数据库字段(如user_id)与Java对象属性(如userId)命名规则不一致的问题。
- 处理复杂对象关系
支持一对一、一对多等关联映射(如用户关联角色、用户包含订单集合)。
二、核心用法
1. 简单字段映射
场景:数据库字段user_name→ Java属性userName
// User.java
public class User {
private Integer userId;
private String userName;
// 省略getter和setter方法
}
在 Mapper XML 文件中使用resultMap
进行映射:
<resultMap id="UserResultMap" type="User">
<id property="userId" column="user_id"/>
<result property="userName" column="user_name"/>
</resultMap>
- <id>:映射主键字段
- <result>:映射普通字段
property
属性指定 Java 对象的属性名,column
属性指定数据库表的字段名。
2. 一对一关联(如用户关联角色)
实体结构:
public class User {
private Integer userId;
private Role role; // 一对一对象
}
XML配置:
<resultMap id="UserWithRoleResultMap" type="User">
<id property="userId" column="user_id"/>
<association property="role" javaType="Role">
<id property="roleId" column="role_id"/>
<result property="roleName" column="role_name"/>
</association>
</resultMap>
- <association>:映射单个关联对象
- javaType:指定关联对象的类型
3. 一对多关联(如用户包含多个订单)
实体结构:
public class User {
private Integer userId;
private List<Order> orders; // 一对多集合
}
XML配置:
<resultMap id="UserWithOrdersResultMap" type="User">
<id property="userId" column="user_id"/>
<collection property="orders" ofType="Order">
<id property="orderId" column="order_id"/>
<result property="orderName" column="order_name"/>
</collection>
</resultMap>
- <collection>:映射对象集合
- ofType:指定集合内元素的类型
三、关键点
- 复用映射:通过resultMap属性引用已定义的映射(如<association resultMap="RoleResultMap"/>)。
- 结果合并:嵌套映射时,确保SQL语句查询所有关联字段(如同时查询user表和role表字段)。
- 性能优化:嵌套结果映射(单次查询)比嵌套查询(多次查询)更高效。