mybatis进阶(4)--一对多查询

1.需求分析:


SELECT orders.* ,user.username,user.sex,user.address,orderdetail.items_id,orderdetail.items_num,orderdetail.orders_id
FROM orders,USER,orderdetail 
WHERE orders.user_id=user.id AND orderdetail.orders_id=orders.id

查询结果:
这里写图片描述

查询出来我们发现,这个orders的id是有重复的,但是同一orders_id它的商品id没有重复的,但是这个时候我们是用resultType去做输出映射的话,orderCustom这个包装pojo类的id就会出现重复。

需求分析:orders映射中不能出现重复记录,所以为了不重复,我们在order.java中添加List<OrderDetail>
最终将订单信息映射到orders中,将订单所对应的订单明细映射到orders中的List<OrderDetail>属性中,这样绝不会出现orderid重复的状况。
每个orders中的List<OrderDetail>都对应了订单明细

给大家展示一张图就明白了:
这里写图片描述
这个订单号只有一个,但是对应的商品有三个,这三个商品在给用户展示的时候就不用每条都展示订单号了。

所以在Orders中有这个属性:

//订单明细
    private List<Orderdetail> orderdetails;

接下来就是写sql:

<!-- 查询订单关联查询用户及订单明细,使用resultmap -->
    <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">
        SELECT 
          orders.*,
          USER.username,
          USER.sex,
          USER.address,
          orderdetail.id orderdetail_id,
          orderdetail.items_id,
          orderdetail.items_num,
          orderdetail.orders_id
        FROM
          orders,
          USER,
          orderdetail
        WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
    </select>

重要的就是接下来这个resultMap的定义了:

<!-- 订单及订单明细的resultMap
    使用extends继承,不用在中配置订单信息和用户信息的映射
     -->
    <resultMap type="com.ddd.mybatis.pojo.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
        <!-- 订单信息 -->
        <!-- 用户信息 -->
        <!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->


        <!-- 订单明细信息
        一个订单关联查询出了多条明细,要使用collection进行映射
        collection:对关联查询到多条记录映射到集合对象中
        property:将关联查询到多条记录映射到com.ddd.mybatis.pojo.Orders哪个属性
        ofType:指定映射到list集合属性中pojo的类型
         -->
         <collection property="orderdetails" ofType="com.ddd.mybatis.pojo.Orderdetail">
            <!-- id:订单明细唯 一标识
            property:要将订单明细的唯 一标识 映射到com.ddd.mybatis.pojo.Orderdetail的哪个属性
              -->
            <id column="orderdetail_id" property="id"/>
            <result column="items_id" property="itemsId"/>
            <result column="items_num" property="itemsNum"/>
            <result column="orders_id" property="ordersId"/>
         </collection>


    </resultMap>

我们在写这个orderdetail属性时需要它的唯一标识,发现它与order的列名是重复的,所以上面的sql最后给它加了别名,这里一定要注意!

mapper接口方法:

//查询订单(关联用户)及订单明细
    public List<Orders>  findOrdersAndOrderDetailResultMap()throws Exception;

测试:

@Test
    public void testFindOrdersAndOrderDetailResultMap() throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取代理对象
        OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class);
        List<Orders> list=ordersMapperCustom.findOrdersAndOrderDetailResultMap();
        System.out.println(list.size());
        for (Orders orders : list) {
            System.out.println(orders);
        }
        sqlSession.close();
    }

结果:(上一节中的orderdetail是空,这次来看看变化)
数据库中我们查到的是6条记录,看看会不会去重呢?
这里写图片描述

看看list的size和它的内容:

Preparing: SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id 
2017-07-18 16:31:27,749 [main] [com.ddd.mybatis.mapper.OrdersMapperCustom.findOrdersAndOrderDetailResultMap]-[DEBUG] ==> Parameters: 
2017-07-18 16:31:27,781 [main] [com.ddd.mybatis.mapper.OrdersMapperCustom.findOrdersAndOrderDetailResultMap]-[DEBUG] <==      Total: 6
5
Orders [id=1, userId=1, number=5, createtime=Wed May 04 00:00:00 CST 2016, note=订单正常, user=User [id=1, username=小明, sex=男, birthday=null, address=北京市海淀区], orderdetails=[Orderdetail [id=1, ordersId=1, itemsId=6, itemsNum=7], Orderdetail [id=10, ordersId=1, itemsId=2, itemsNum=34]]]
Orders [id=2, userId=3, number=15, createtime=Mon Jul 04 00:00:00 CST 2016, note=订单正常2, user=User [id=3, username=huauhua, sex=女, birthday=null, address=河南郑州], orderdetails=[Orderdetail [id=3, ordersId=2, itemsId=4, itemsNum=27]]]
Orders [id=3, userId=13, number=25, createtime=Fri Nov 04 00:00:00 CST 2016, note=订单正常3, user=User [id=13, username=杰克, sex=男, birthday=null, address=美国纽约], orderdetails=[Orderdetail [id=2, ordersId=3, itemsId=5, itemsNum=17]]]
Orders [id=4, userId=4, number=53, createtime=Tue Oct 04 00:00:00 CST 2016, note=订单正常4, user=User [id=4, username=小明星, sex=男, birthday=null, address=北京市海淀区4], orderdetails=[Orderdetail [id=7, ordersId=4, itemsId=7, itemsNum=1]]]
Orders [id=5, userId=6, number=14, createtime=Fri Nov 04 00:00:00 CST 2016, note=订单正常5, user=User [id=6, username=大张伟, sex=男, birthday=null, address=广州佛山], orderdetails=[Orderdetail [id=4, ordersId=5, itemsId=3, itemsNum=73]]]

打印出来size是5,而且在第一个记录里面有两个detail记录,这符合我们的需求。
相当于Java中的双重循环。

总结:
mybatis使用collection对于关联查询的多条记录结果映射到list集合属性中。
如果使用resultType实现,我们可以将订单明细映射到orders中的orderdetail中去,需要自己处理,使用双重循环遍历去掉重复记录,将订单明细放到orderdetail中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值