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

查询结果:
mybatis进阶(4)--一对多查询_第1张图片

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

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

给大家展示一张图就明白了:
mybatis进阶(4)--一对多查询_第2张图片
这个订单号只有一个,但是对应的商品有三个,这三个商品在给用户展示的时候就不用每条都展示订单号了。

所以在Orders中有这个属性:

//订单明细
    private List orderdetails;

接下来就是写sql:


    <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 type="com.ddd.mybatis.pojo.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
        
        
        


        
         <collection property="orderdetails" ofType="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  findOrdersAndOrderDetailResultMap()throws Exception;

测试:

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

结果:(上一节中的orderdetail是空,这次来看看变化)
数据库中我们查到的是6条记录,看看会不会去重呢?
mybatis进阶(4)--一对多查询_第3张图片

看看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中。

你可能感兴趣的:(mybatis)