上文总结了在单表中将数据库字段与实体类属性映射的方法。但是在实际场景中,我们常常遇到多表映射,也就是说实体类中有另外一个实体类的属性,这种情况我们如何处理呢?
1. 需求说明
假设目前存在顾客表与订单表,一个订单与一个顾客对应。因此,在订单实体类中,应该有一个顾客类的属性。如下所示:
public class Customer {
private Integer customerId;
private String customerName;
}
public class Order {
private Integer orderId;
private String orderName;
private Customer customer;
}
2. OrderMapper接口
定义一个方法,根据订单id查询订单信息及对应的顾客信息
public interface OrderMapper {
Order selectOrderWithCustomer(Integer orderId);
}
3. OrderMapper.xml配置文件
<!-- 创建resultMap实现“对一”关联关系映射 -->
<!-- id属性:通常设置为这个resultMap所服务的那条SQL语句的id加上“ResultMap” -->
<!-- type属性:要设置为这个resultMap所服务的那条SQL语句最终要返回的类型 -->
<resultMap id="selectOrderWithCustomerResultMap" type="order">
<!-- 先设置Order自身属性和字段的对应关系 -->
<id column="order_id" property="orderId"/>
<result column="order_name" property="orderName"/>
<!-- 使用association标签配置“对一”关联关系 -->
<!-- property属性:在Order类中对一的一端进行引用时使用的属性名 -->
<!-- javaType属性:一的一端类的全类名 -->
<association property="customer" javaType="customer">
<!-- 配置Customer类的属性和字段名之间的对应关系 -->
<id column="customer_id" property="customerId"/>
<result column="customer_name" property="customerName"/>
</association>
</resultMap>
<!-- Order selectOrderWithCustomer(Integer orderId); -->
<select id="selectOrderWithCustomer" resultMap="selectOrderWithCustomerResultMap">
SELECT order_id,order_name,c.customer_id,customer_name
FROM t_order o
LEFT JOIN t_customer c
ON o.customer_id=c.customer_id
WHERE o.order_id=#{orderId}
</select>
总结:
- 一对一映射时,在resultMap中使用标签association
- resultMap中的 property属性值要与被关联的实体类属性名相同,例如上述例子中的customer
- resultMap中的javaType属性值为被关联的实体类的全类名