文档章节

【MyBatis框架】高级映射-一对多查询

M
 Mysoft
发布于 2015/09/18 14:50
字数 943
阅读 56
收藏 1

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

一对多查询

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

本文转载自:http://blog.csdn.net/acmman/article/details/46646033

M
粉丝 4
博文 58
码字总数 24535
作品 0
广州
高级程序员
私信 提问
mybatis学习笔记(2)-mybatis概述

mybatis学习笔记(2)-mybatis概述 标签: mybatis [TOC] 本文对mybatis做一个简单介绍,包括框架原理,执行过程,开发方法,输入输出映射以及动态sql,我会在后续的系列文章中一一详细说明 my...

brianway
2016/02/27
465
0
MyBatis之使用resultMap实现高级映射

对于数据库中对表的增删改查操作,我们知道增删改都涉及的是单表,而只有查询操作既可以设计到单表操作又可以涉及到多表操作,所以对于输入映射parameterType而言是没有所谓的高级映射的,也...

瑟青豆
2018/06/20
65
0
MyBatis 实践 -动态SQL/关联查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hanqing280441589/article/details/50761310 标签: Java与存储 动态SQL 动态SQL提供了对SQL语句的灵活操作,...

菜鸟-翡青
2016/02/28
0
0
mybatis---高级映射、延迟加载、查询缓存

高级映射(resultMap返回) 首先 书写查询语句 其次 配置resultMap 什么是延迟加载 resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、colle...

lambdaλ
2018/08/01
0
0
史上最简单的 MyBatis 教程(五)

1 前言 在史上最简单的 MyBatis 教程(一、二、三、四)中,咱们已经把 MyBatis 框架的基本内容了解的差不多啦,然而美中不足的是:在前四篇博文的示例中,咱们仅仅演示了一对一(1:1)的映射...

qq_35246620
2017/03/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
11分钟前
1
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
13分钟前
1
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
15分钟前
1
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
19分钟前
1
0
使用nodeJS实现前端项目自动化之项目构建和文件合并

本文转载于:专业的前端网站➜使用nodeJS实现前端项目自动化之项目构建和文件合并 前面的话   一般地,我们使用构建工具来完成项目的自动化操作。本文主要介绍如何使用nodeJS来实现简单的项...

前端老手
32分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部