SSM项目从零开始到入门031-mybatis的一对多关联映射

  先祭出上篇文章的关系图,上篇我们实现了,查询订单的同时查询订单所属的用户信息。现在有了新的问题,就是查询订单时,不光实现上篇功能,同时还要将订单明细查询出来。这就涉及到了一对多的查询。

首先我们写出查询的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());
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心歌技术

打赏不能超过你的早餐钱!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值