mybatis进阶(4)--一对多查询
来源:互联网 发布:苹果发布会 mac 编辑:程序博客网 时间:2024/06/03 19:00
1.需求分析:
SELECT orders.* ,user.username,user.sex,user.address,orderdetail.items_id,orderdetail.items_num,orderdetail.orders_idFROM 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: 65Orders [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进阶(4)--一对多查询
- mybatis查询(一对多查询)
- mybatis一对多查询
- mybatis一对多查询
- Mybatis一对多查询
- Mybatis 一对多 查询
- mybatis 一对多查询
- Mybatis 一对多 查询
- Mybatis一对多查询
- Mybatis一对多查询
- Mybatis(一对多查询)
- mybatis(8)一对多查询
- MyBatis高级映射(一对多查询)
- mybatis一对多查询配置
- mybatis 嵌套查询,一对多
- Mybatis一对多关联查询
- mybatis 一对多,嵌套查询
- mybatis一对一,一对多查询
- JAVA设计模式之工厂方法模式
- NotePad使用markdown Preview
- Opencv中Mat数据类型CV_8UC3转换为 CV_32FC3注意事项
- 基于stm32f103ve移植ucGUI简要步骤
- mybatis+mysql 实现批量插入、创建联合索引
- mybatis进阶(4)--一对多查询
- jsp:超出字数显示省略号;鼠标悬停显示完整文本
- 晒越老越值钱的工作_有你的吗?
- spring容器中bean的name属性指定类文件位置错误
- @RequestParam 和 @ PathVariable 的区别
- html5页面中打开本地app,如果没有跳转下载页面的解决方案
- ArrayList源码(1)
- Intellij学习笔记 --- 更改maven本地路径和外部仓库地址
- QML 学习笔记