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
最终将订单信息映射到orders中,将订单所对应的订单明细映射到orders中的List
每个orders中的List
给大家展示一张图就明白了:
这个订单号只有一个,但是对应的商品有三个,这三个商品在给用户展示的时候就不用每条都展示订单号了。
所以在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条记录,看看会不会去重呢?
看看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中。