【MyBatis框架】高级映射-一对多查询
前面学习了一对一的查询,现在我们在刚才的数据模型基础上进行一对多的查询。
一对多查询
1.需求
查询订单及订单明细的信息。
2.sql语句
确定主查询表:订单表
确定关联查询表:订单明细表
在一对一查询基础上添加订单明细表关联即可。
- 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
3.分析
使用resultType将上边的 查询结果映射到pojo中,订单信息的就是重复。
如图
要求:
对orders映射不能出现重复记录。
4.在orders中添加list订单明细属性
在orders.java类中添加List<orderDetail> orderDetails属性。
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。
- package cn.edu.hpu.mybatis.PO;
- import java.util.Date;
- import java.util.List;
- public class Orders {
- private Integer id;
- private Integer userId;
- private String number;
- private Date creattime;
- private String note;
- //用户信息
- private User user;
- //订单明细
- private List<Orderdetail> orderdetils;
- //get和set方法省略
- }
其中Orderdetail为
- package cn.edu.hpu.mybatis.PO;
- public class Orderdetail {
- private int id;
- private int orders_id;
- private int items_id;
- private int items_num;
- //get和set方法省略
- }
映射成的orders记录数为两条(orders信息不重复)
每个orders中的orderDetails属性存储了该订单所对应的订单明细。
5.mapper.xml
- <pre name="code" class="html"><!-- 查询订单关联查询用户信息以及订单明细,使用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>
6.resultMap定义
- <!-- 订单及订单明细的resultMap
- 使用extend继承,不用在此中配置订单信息和用户信息的映射 -->
- <resultMap type="cn.edu.hpu.mybatis.PO.Orders" id="OrdersAndOrderDetailResultMap"
- extends="OrdersUserResultMap">
- <!-- 使用extend继承,不用在此中配置订单信息和用户信息的映射 -->
- <!-- 订单明细信息
- 一个订单关联查询出了多个明细,要使用
- collection进行映射
- collection:对关联查询到多条记录映射cn.edu.hpu.mybatis.PO.Orders哪个属性
- ofType:指定要映射到的集合属性中pojo的类型(就是一个List<Orderdetail>的尖括号中的类型)
- -->
- <collection property="orderdetils" ofType="cn.edu.hpu.mybatis.PO.Orderdetail">
- <!-- id:订单明细的唯一标识 -->
- <id column="orderdetail_id" property="id"/>
- <result column="items_id" property="items_id"/>
- <result column="items_num" property="items_num"/>
- <result column="orders_id" property="orders_id"/>
- </collection>
- </resultMap>
7.mapper.java
- package cn.edu.hpu.mybatis.mapper;
- import java.util.List;
- import cn.edu.hpu.mybatis.PO.Orders;
- import cn.edu.hpu.mybatis.PO.OrdersCustom;
- //订单mapper
- public interface OrdersCustomMapper {
- //...
- //查询订单(关联查询用户)及订单明细使用resultMap
- public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;
- }
8.测试:
- @Test
- public void testFindOrdersAndOrderDetailResultMap() throws Exception{
- SqlSession sqlSession=sqlSessionFactory.openSession();
- //创建代理对象
- OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class);
- //调用mapper的方法
- List<Orders> list=ordersMapperCustom.findOrdersAndOrderDetailResultMap();
- for (int i = 0; i < list.size(); i++) {
- Orders o=list.get(i);
- User u=o.getUser();
- System.out.println("\n下单用户:");
- System.out.println(u.getUsername()+"|"+u.getSex()+"|"+u.getAddress());
- System.out.println("订单明细:");
- List<Orderdetail> os=o.getOrderdetils();
- if(os!=null){
- for (int j = 0; j < os.size(); j++) {
- Orderdetail od=os.get(j);
- System.out.println("订单id:"+od.getOrders_id()+
- "商品id:"+od.getItems_id()+"订单总数:"+od.getItems_num());
- }
- }
- }
- sqlSession.close();
- }
测试结果:
下单用户:
张三|男|河南焦作
订单明细:
订单id:1商品id:1订单总数:2
下单用户:
张三|男|河南焦作
订单明细:
订单id:2商品id:2订单总数:2
下单用户:
刘莉莉|女|山东威海
订单明细:
订单id:3商品id:3订单总数:1
日志输出:
- DEBUG [main] - Opening JDBC Connection
- DEBUG [main] - Created connection 18135083.
- DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@114b82b]
- 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
- DEBUG [main] - ==> Parameters:
- DEBUG [main] - <== Total: 3
测试成功!
9.小结
mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。
使用resultType实现:
将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。
【MyBatis框架】高级映射-一对多查询相关推荐
- mybatis高级映射一对多查询(一)
最近一直在研究mybatis,查询是并不可少的研究内容.mybatis的一对多的查询,个人觉得比hibernate简单的很多.好了,废话不多说了,下面以一个简单的例子解释一下mybatis的一对多的查 ...
- mybatis 高级映射 - 一对多查询 - collection
方法一 连接表查询 案例:查询所有订单信息及订单下的订单明细信息. 订单信息与订单明细为一对多关系. 使用resultMap实现如下: Sql语句: SELECT orders.*,user.user ...
- MyBatis的高级映射之多对一
第五节 MyBatis的高级映射之多对一 2016年3月4日 星期五 09:25 使用传统方式的形式 使用MyBatis的方式 这样会产生两条语句 使用ResultMap的方式,对结果进行映射和转换, ...
- Mybatis(四) 高级映射,一对一,一对多,多对多映射
天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种 ...
- mybatis高级映射多对多查询(二)
在这篇博客中,我来介绍下mybatis中的多对多查询的案例,在mybatis中,如何使用ResultMap来实现多对多的查询? 案例:一个user可以有很多role,一个role可以有很多entitl ...
- SSM之Mybatis框架高级
1.resultMap高级操作:联合查询操作 #1 一对一关联查询 例如:根据订单关联查询用户 输出映射: resultType:自定义一个拓展的的pojo resultMap: 这里的resultM ...
- Mybatis学习记录(六)----Mybatis的高级映射
作者:余家小子 1.一对多查询 1.1 需求 查询订单及订单明细的信息. 1.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT ...
- MyBatis学习--高级映射
简介 前面说过了简单的数据库查询和管理查询,在开发需求中有一些一对一.一对多和多对多的需求开发,如在开发购物车的时候,订单和用户是一对一,用户和订单是一对多,用户和商品是多对多.这些在Hibernat ...
- mybatis (高级映射 缓存 延迟加载)
1 一对一查询映射的pojo 创建pojo包括 订单信息和用户信息,resultType才可以完成映射. 一个订单对应一个用户 因此在订单实体类中 我们应该加入一个用户属性 实体类如下: ...
最新文章
- html文章整体居中,div居中与div内容居中
- java程序并行机制_Java语言具有多种优点和特点,下列选项中,______反映了Java程序并行执行机制的特点。A.多线程B.健...
- java怎样生成32位全是整形的主键_你肯定会需要的分布式Id生成算法雪花算法(Java)...
- IM的扫码登录功能如何实现?一文搞懂主流的扫码登录技术原理
- FCGF论文阅读笔记
- 3004基于二叉链表的二叉树的双序遍历(附题意解释)
- matlab cable,Matlab_Wireless_Communications_example MATLAB通信技术的全部例程(全)包括WCDMA - 下载 - 搜珍网...
- UE4 Packaging and Cooking Games
- centos修改主机名的正确方法
- npu算力如何计算_华为云郑叶来:多元算力驱动应用创新
- 洛谷 P1312 Mayan游戏
- fat32 linux 打包工具_UbuntuLinux默认安装图形化的压缩工具是File-Roller文件打包器.ppt...
- 读书笔记-互联网鲇鱼法则
- 使用CSS控制表单样式/示例演示
- 教你用3DMAX打造个性鲜明卡通角色
- AD画PCB时,如何自动删除之前的连线
- 地理信息系统实习教程 第26章 地图注记
- 好用的json在线工具
- 纯Css制作tab选项卡
- 羽毛球场示意图及羽毛球比赛规则