在 MyBatis 中,resultMap用来将数据库查询结果映射到 Java 对象。定义了如何将 SQL 查询结果的列与 Java 对象的属性进行映射。它支持复杂的映射关系,如一对多、多对一等。
基本的ResultMap
假设有一个User类:
class User {
private Long id;
private String username;
}
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="user_name"/>
</resultMap>
id表示主键映射,通常对应数据库表中的主键字段。【要放在第一行】
result表示普通字段映射,property是Java类的属性,column是数据库表中的列名
上边的resultMap对应的select语句就可以这么写:
select id "user_id", username "user_name"
from user;
开启autoMapping映射
autoMapping映射是一种自动映射机制,用于自动将 SQL 查询结果的列与 Java 对象的属性进行匹配。它简化了映射的配置,不需要显式地为每个属性定义映射关系。
<resultMap id="userResultMap" type="User" autoMapping="true" />
上边的resultMap对应的select语句就可以这么写:
select id, username
from user;
在启用了 autoMapping
后,user_id
会自动映射到 userId
。
复杂的ResultMap
一对多映射[collection]
场景:有一个user对象,和一个Order对象,一个用户可以有多个订单。
一个User类如下:
class User {
private Long id;
private String User;
List<Order> orders;
}
class Order {
private Long id;
private Date orderDate;
}
在这个例子中,User
类有一个 orders
属性(一个 List<Order>
)。collection
元素用于指定一对多的映射关系,ofType
属性指定集合中元素的类型。
<resultMap id="userResultMap" type="User" autoMapping = "true">
<id property="id" column="user_id"/>
<collection property="orders" ofType="Order" autoMapping = "true">
<id property="id" column="order_id"/>
</collection>
</resultMap>
使用Mybatis-Plus的分页插件进行分页查询时,如果结果需要使用<collection>
进行映射,只能使用嵌套查询,而不能使用嵌套结果映射。
多对一映射[association]
场景:有一个 Order
对象,它关联到一个 User
对象。
class User {
private Long id;
private String User;
}
class Order {
private Long id;
private Date orderDate;
private User user;
}
在这个例子中,Order
对象的 user
属性是通过 association
映射的,它表示多对一关系。
<resultMap id="orderResultMap" type="Order" autoMapping="true">
<id property="orderId" column="order_id"/>
<association property="user" javaType="User" autoMapping="true">
<id property="id" column="user_id"/>
</association>
</resultMap>
ResultMap中的属性
- property:映射的 Java 类的属性名称。
- column:数据库表中的列名。
- javaType:用于指定映射的 Java 类型。
- typeHandler:用于指定类型处理器,处理数据库列和 Java 属性之间的转换。
- ofType:用于集合映射时,指定集合中元素的类型。
- association:用于表示一对多或多对一关系映射。