前面学习了一对一的查询,现在我们在刚才的数据模型基础上进行一对多的查询。

一对多查询

1.需求
查询订单及订单明细的信息。

2.sql语句
确定主查询表:订单表
确定关联查询表:订单明细表
在一对一查询基础上添加订单明细表关联即可。

[sql] view plaincopy
  1. SELECT
  2. orders.*,
  3. USER.username,
  4. USER.sex,
  5. USER.address,
  6. orderdetail.id orderdetail_id,
  7. orderdetail.items_id,
  8. orderdetail.items_num,
  9. orderdetail.orders_id
  10. FROM
  11. orders,
  12. USER,
  13. orderdetail
  14. WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id

3.分析
使用resultType将上边的 查询结果映射到pojo中,订单信息的就是重复。

如图

要求:
对orders映射不能出现重复记录。

4.在orders中添加list订单明细属性

在orders.java类中添加List<orderDetail> orderDetails属性。
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。

[java] view plaincopy
  1. package cn.edu.hpu.mybatis.PO;
  2. import java.util.Date;
  3. import java.util.List;
  4. public class Orders {
  5. private Integer id;
  6. private Integer userId;
  7. private String number;
  8. private Date creattime;
  9. private String note;
  10. //用户信息
  11. private User user;
  12. //订单明细
  13. private List<Orderdetail> orderdetils;
  14. //get和set方法省略
  15. }

其中Orderdetail为

[java] view plaincopy
  1. package cn.edu.hpu.mybatis.PO;
  2. public class Orderdetail {
  3. private int id;
  4. private int orders_id;
  5. private int items_id;
  6. private int items_num;
  7. //get和set方法省略
  8. }

映射成的orders记录数为两条(orders信息不重复)
每个orders中的orderDetails属性存储了该订单所对应的订单明细。

5.mapper.xml

[java] view plaincopy
  1. <pre name="code" class="html"><!-- 查询订单关联查询用户信息以及订单明细,使用resultMap -->
  2. <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">
  3. SELECT
  4. orders.*,
  5. USER.username,
  6. USER.sex,
  7. USER.address,
  8. orderdetail.id orderdetail_id,
  9. orderdetail.items_id,
  10. orderdetail.items_num,
  11. orderdetail.orders_id
  12. FROM
  13. orders,
  14. USER,
  15. orderdetail
  16. WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
  17. </select>

6.resultMap定义

[html] view plaincopy
  1. <!-- 订单及订单明细的resultMap
  2. 使用extend继承,不用在此中配置订单信息和用户信息的映射 -->
  3. <resultMap type="cn.edu.hpu.mybatis.PO.Orders" id="OrdersAndOrderDetailResultMap"
  4. extends="OrdersUserResultMap">
  5. <!-- 使用extend继承,不用在此中配置订单信息和用户信息的映射 -->
  6. <!-- 订单明细信息
  7. 一个订单关联查询出了多个明细,要使用
  8. collection进行映射
  9. collection:对关联查询到多条记录映射cn.edu.hpu.mybatis.PO.Orders哪个属性
  10. ofType:指定要映射到的集合属性中pojo的类型(就是一个List<Orderdetail>的尖括号中的类型)
  11. -->
  12. <collection property="orderdetils" ofType="cn.edu.hpu.mybatis.PO.Orderdetail">
  13. <!-- id:订单明细的唯一标识 -->
  14. <id column="orderdetail_id" property="id"/>
  15. <result column="items_id" property="items_id"/>
  16. <result column="items_num" property="items_num"/>
  17. <result column="orders_id" property="orders_id"/>
  18. </collection>
  19. </resultMap>

7.mapper.java

[java] view plaincopy
  1. package cn.edu.hpu.mybatis.mapper;
  2. import java.util.List;
  3. import cn.edu.hpu.mybatis.PO.Orders;
  4. import cn.edu.hpu.mybatis.PO.OrdersCustom;
  5. //订单mapper
  6. public interface OrdersCustomMapper {
  7. //...
  8. //查询订单(关联查询用户)及订单明细使用resultMap
  9. public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;
  10. }

8.测试:

[java] view plaincopy
  1. @Test
  2. public void testFindOrdersAndOrderDetailResultMap() throws Exception{
  3. SqlSession sqlSession=sqlSessionFactory.openSession();
  4. //创建代理对象
  5. OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class);
  6. //调用mapper的方法
  7. List<Orders> list=ordersMapperCustom.findOrdersAndOrderDetailResultMap();
  8. for (int i = 0; i < list.size(); i++) {
  9. Orders  o=list.get(i);
  10. User u=o.getUser();
  11. System.out.println("\n下单用户:");
  12. System.out.println(u.getUsername()+"|"+u.getSex()+"|"+u.getAddress());
  13. System.out.println("订单明细:");
  14. List<Orderdetail> os=o.getOrderdetils();
  15. if(os!=null){
  16. for (int j = 0; j < os.size(); j++) {
  17. Orderdetail od=os.get(j);
  18. System.out.println("订单id:"+od.getOrders_id()+
  19. "商品id:"+od.getItems_id()+"订单总数:"+od.getItems_num());
  20. }
  21. }
  22. }
  23. sqlSession.close();
  24. }

测试结果:

下单用户:
张三|男|河南焦作
订单明细:
订单id:1商品id:1订单总数:2

下单用户:
张三|男|河南焦作
订单明细:
订单id:2商品id:2订单总数:2

下单用户:
刘莉莉|女|山东威海
订单明细:
订单id:3商品id:3订单总数:1

日志输出:

[plain] view plaincopy
  1. DEBUG [main] - Opening JDBC Connection
  2. DEBUG [main] - Created connection 18135083.
  3. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@114b82b]
  4. DEBUG [main] - ==>  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
  5. DEBUG [main] - ==> Parameters:
  6. DEBUG [main] - <==      Total: 3

测试成功!

9.小结
mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。

使用resultType实现:

将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。

【MyBatis框架】高级映射-一对多查询相关推荐

  1. mybatis高级映射一对多查询(一)

    最近一直在研究mybatis,查询是并不可少的研究内容.mybatis的一对多的查询,个人觉得比hibernate简单的很多.好了,废话不多说了,下面以一个简单的例子解释一下mybatis的一对多的查 ...

  2. mybatis 高级映射 - 一对多查询 - collection

    方法一 连接表查询 案例:查询所有订单信息及订单下的订单明细信息. 订单信息与订单明细为一对多关系. 使用resultMap实现如下: Sql语句: SELECT orders.*,user.user ...

  3. MyBatis的高级映射之多对一

    第五节 MyBatis的高级映射之多对一 2016年3月4日 星期五 09:25 使用传统方式的形式 使用MyBatis的方式 这样会产生两条语句 使用ResultMap的方式,对结果进行映射和转换, ...

  4. Mybatis(四) 高级映射,一对一,一对多,多对多映射

    天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种 ...

  5. mybatis高级映射多对多查询(二)

    在这篇博客中,我来介绍下mybatis中的多对多查询的案例,在mybatis中,如何使用ResultMap来实现多对多的查询? 案例:一个user可以有很多role,一个role可以有很多entitl ...

  6. SSM之Mybatis框架高级

    1.resultMap高级操作:联合查询操作 #1 一对一关联查询 例如:根据订单关联查询用户 输出映射: resultType:自定义一个拓展的的pojo resultMap: 这里的resultM ...

  7. Mybatis学习记录(六)----Mybatis的高级映射

    作者:余家小子 1.一对多查询 1.1 需求 查询订单及订单明细的信息. 1.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT ...

  8. MyBatis学习--高级映射

    简介 前面说过了简单的数据库查询和管理查询,在开发需求中有一些一对一.一对多和多对多的需求开发,如在开发购物车的时候,订单和用户是一对一,用户和订单是一对多,用户和商品是多对多.这些在Hibernat ...

  9. mybatis (高级映射 缓存 延迟加载)

    1     一对一查询映射的pojo 创建pojo包括 订单信息和用户信息,resultType才可以完成映射. 一个订单对应一个用户   因此在订单实体类中 我们应该加入一个用户属性  实体类如下: ...

最新文章

  1. html文章整体居中,div居中与div内容居中
  2. java程序并行机制_Java语言具有多种优点和特点,下列选项中,______反映了Java程序并行执行机制的特点。A.多线程B.健...
  3. java怎样生成32位全是整形的主键_你肯定会需要的分布式Id生成算法雪花算法(Java)...
  4. IM的扫码登录功能如何实现?一文搞懂主流的扫码登录技术原理
  5. FCGF论文阅读笔记
  6. 3004基于二叉链表的二叉树的双序遍历(附题意解释)
  7. matlab cable,Matlab_Wireless_Communications_example MATLAB通信技术的全部例程(全)包括WCDMA - 下载 - 搜珍网...
  8. UE4 Packaging and Cooking Games
  9. centos修改主机名的正确方法
  10. npu算力如何计算_华为云郑叶来:多元算力驱动应用创新
  11. 洛谷 P1312 Mayan游戏
  12. fat32 linux 打包工具_UbuntuLinux默认安装图形化的压缩工具是File-Roller文件打包器.ppt...
  13. 读书笔记-互联网鲇鱼法则
  14. 使用CSS控制表单样式/示例演示
  15. 教你用3DMAX打造个性鲜明卡通角色
  16. AD画PCB时,如何自动删除之前的连线
  17. 地理信息系统实习教程 第26章 地图注记
  18. 好用的json在线工具
  19. 纯Css制作tab选项卡
  20. 羽毛球场示意图及羽毛球比赛规则

热门文章

  1. cat6 万兆_cat6 万兆
  2. 定个小目标,炒股咯....
  3. 使用Chrome保存网页为mht文件
  4. 艾媒:ofo活跃用户规模为摩拜近2倍 每10辆共享单车7辆小黄车
  5. Atitit.每周计划日程表 流程表v3
  6. Log4j(二)—— Log4j基本使用方法
  7. InstallShield 2008 终止声明 (EOL)对最终客户意味着什么
  8. Ubuntu中让SSH自动重连
  9. 框架设计之菜鸟漫漫江湖路系列 开篇
  10. 查找系列合集-二分查找