先祭出上篇文章的关系图,上篇我们实现了,查询订单的同时查询订单所属的用户信息。现在有了新的问题,就是查询订单时,不光实现上篇功能,同时还要将订单明细查询出来。这就涉及到了一对多的查询。
首先我们写出查询的SQL语句
SELECT
o.*, u.* , d.*
FROM
t_order o , t_user u , t_orderdetail d
WHERE
o.user_id = u.id AND o.id = d.order_id
从结果中可以看出,订单的信息有重复,这是因为id为1的订单有两条订单详情。所以如果我们用resultType来做映射的话就会出现订单信息的重复,我们不希望出现这个结果,即对orders的映射不能出现重复记录的情况。那么我们就需要在Orders.java类中添加一个List<OrderDetail> orderDetails属性来封装订单明细项,将订单信息映射到Orders中。
/**
* 订单表
*/
public class Order {
/**
* 订单id
*/
private Integer id;
/**
* 用户id
*/
private Long userId;
/**
* 订单号
*/
private String orderNumber;
/**
* 一个订单对应一个用户【一对一次采用对象】
*/
private User user;
/**
* 一个订单包含多个订单明细【一对多采用集合】
*/
private List<OrderDetail> details;
//get ... set 省略
}
然后我们编写mapper接口方法
/**
* 返回所有订单列表及订单明细
* @return List<Order>
*/
public List<Order> queryOrderUserAndOrderDetail();
然后编辑映射文件xml
1.首先编写resultmap
<resultMap type="com.lcx.mybatis.pojo.Order" id="OrderUserAndOrderDetailResultMap" extends="OrderUserResultMap">
<!-- 配置关联的订单明细信息 -->
<collection property="details" ofType="com.lcx.mybatis.pojo.OrderDetail">
<id column="id" property="id"/>
<result column="order_id" property="orderId"/>
<result column="item_id" property="item.id"/>
<result column="total_price" property="totalPrice"/>
<result column="status" property="status"/>
</collection>
</resultMap>
这里直接继承前面所设置的OrderUserResultMap
2.然后加入sql查询
<select id="queryOrderUserAndOrderDetail" resultMap="OrderUserAndOrderDetailResultMap">
SELECT
o.*, u.*, d.*
FROM
t_order o,
t_user u,
t_orderdetail d
WHERE
o.user_id = u.id AND o.id = d.order_id
</select>
最后我们编辑测设类测试一下
@Test
public void queryOrderUserAndOrderDetailTest() {
List<Order> queryOrderAndUserAll = orderMapper.queryOrderUserAndOrderDetail();
for (Order order : queryOrderAndUserAll) {
System.out.println(order.toString());
}
for (Order order : queryOrderAndUserAll) {
System.out.println(order.getDetails().size());
}
}