【需求】

查询订单以及订单明细的信息。

确定主查询表:订单表orders

确定关联查询表:订单明细表 orderdetail

在一对一查询的基础上添加订单明细表关联即可。

【分析】

使用resultMap将上面的查询结果映射到pojo中,订单信息有重复。

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

在orders.java类中添加List<orderDetail> orderDetails属性。

最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。如下所示:

映射成的orders记录为两条(orders信息不能重复)

每个orders中的orderDetails属性存储了该订单所对应的订单明细。

【工程截图】

【User.java】

package cn.higgin.mybatis.po;

import java.util.Date;

public class User {
//属性名和数据库表的字段对应
private int id;
private String username;
private String sex;
private Date birthday;
private String address;
//set/get方法忽略.....
}

【Orderdetail.java】

package cn.higgin.mybatis.po;

public class Orderdetail {
private Integer id; private Integer ordersId; private Integer itemsId; private Integer itemsNum;
//get/set方法忽略......
}

【Orders.java】

package cn.higgin.mybatis.po;
import java.util.Date;
import java.util.List; public class Orders { private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//引入用户信息
private User user;
//引入订单明细(和上面的用户信息不同,一个是一对一,一个是一对多)
private List<Orderdetail> orderdetails; //注意是orderdetails,一个有's',一个有's'
//忽略set/get方法......
}

【OrdersMapperCustom.java】

package cn.higgin.mybatis.mapper;

import java.util.List;

import cn.higgin.mybatis.po.Orders;

public interface OrdersMapperCustom {

    //查询订单(关联用户)及订单明细
public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;
}

【OrdersMapperCustomer.xml】

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.higgin.mybatis.mapper.OrdersMapperCustom"> <!--
订单查询关联用户的resultMap
将整个查询的结果映射到cn.higgin.mybatis.po.Orders中
-->
<resultMap type="cn.higgin.mybatis.po.Orders" id="OrdersUserResultMap">
<!-- 配置订单的映射信息 -->
<!--
id:指定查询列中的唯一标识,订单信息中的唯一标识,若有多个列组成唯一标识,需配置多个id
column: 订单信息的唯一标识列
property: 订单信息的唯一标识列所映射到的 Orders的对应的属性
-->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number" />
<result column="createtime" property="createtime"/>
<result column="note" property="note" /> <!-- 配置映射的关联的用户信息 -->
<!-- association:用于映射关联查询单个对象的信息
property:要将关联查询的用户信息映射到Orders中的对应属性
-->
<association property="user" javaType="cn.higgin.mybatis.po.User">
<!--
id:关联查询用户的唯一标识
column:指定唯一标识用户信息的列
javaType:映射到user的对应属性
-->
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap> <!-- 订单及订单明细的resultType
使用extends继承OrdersUserResultMap中的信息,无需在其中配置订单和用户的信息
-->
<resultMap type="cn.higgin.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap"
extends="OrdersUserResultMap">

<!-- 1.订单信息(从继承的OrdersUserResultMap中获取) --> <!-- 2.用户信息(从继承的OrdersUserResultMap中获取) --> <!-- 订单明细信息
一个订单关联查询出了多条明细,要使用collection进行映射
collection:对关联查询到多条记录映射到集合对象中
property: 将关联查询到多条记录映射到cn.higgin.mybatis.po.Orders的对应属性
ofType: 指定映射到list集合属性中pojo的类型,在[Orders.java]中的 private List<Orderdetail> orderdetails;
-->
<collection property="orderdetails" ofType="cn.higgin.mybatis.po.Orderdetail">
<!-- id:订单明细唯一标识
property:要将订单明细的唯一标识映射到cn.higgin.mybatis.po.Orderdetail的对应属性 -->
<id column="orderdetail_id" property="id"/>
<result column="items_id" property="id"/>
<result column="items_num" property="itemsNum"/>
<result column="orders_id" property="ordersId"/>
</collection>
</resultMap> <!-- 查询订单关联查询用户信息,使用resultMap -->
<select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">
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
</select> </mapper>

【SplMapConfig.xml 和 db.properties 与前一篇博文相同】

【OrdersMapperCustomTest.java】

package cn.higgin.mybatis.mapper;

import java.io.InputStream;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import cn.higgin.mybatis.po.Orders; public class OrdersMapperCustomTest {
private SqlSessionFactory sqlSessionFactory; // 此方法是在执行testFindUserById之前执行
@Before
public void setUp() throws Exception {
// 创建sqlSessionFactory // mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindOrdersUser() throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
//创建代理对象
OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class); //调用mapper的方法
List<Orders> list=ordersMapperCustom.findOrdersAndOrderDetailResultMap(); System.out.println(list.size()); sqlSession.close();
}
}

【debug运行结果】

可见只有两条记录:

再查看一下具体内容:

注意:重复的数据被合并,不重复的数据在集合中,下图作对比:

【小结】

mybatis使用resultMap的collection对关联查询的多条记录映射映射到一个list集合属性中(private List<Orderdetail> orderdetails;)。

使用resultType也可以实现:

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

19_高级映射:一对多查询(使用resultMap)的更多相关文章

  1. 零基础学习java------37---------mybatis的高级映射(单表查询,多表(一对一,一对多)),逆向工程,Spring(IOC,DI,创建对象,AOP)

    一.  mybatis的高级映射 1  单表,字段不一致 resultType输出映射: 要求查询的字段名(数据库中表格的字段)和对应的java类型的属性名一致,数据可以完成封装映射 如果字段和jav ...

  2. 【MyBatis学习08】高级映射之一对一查询

    从这一篇博文开始,将总结一下mybatis中的几个高级映射,即一对一.一对多.多对多查询,这篇先总结一下mybatis中的一对一查询.  为了模拟这些需求,事先要建立几个表,不同的表之间将对应上面提到 ...

  3. 18_高级映射:一对一查询(使用resultMap)

    [简述] 数据库模型和数据等信息与上一篇博文相同. 需求也同上一篇博文. [工程截图] [User.java]POJO package cn.higgin.mybatis.po; import jav ...

  4. 17_高级映射:一对一查询(使用resultType)

    [数据库模型] [各个表] [ 用户表user ] 购买商品的用户信息. [ 订单表 ] 用户所创建的订单 [ 订单明细表 ] 订单的详细信息,即购买商品的信息 [ 商品表 ] 商品的具体信息 [有关 ...

  5. mybatis高级映射-一对多

    订单(一)和(多)订单明细 数据库结构如下所示[演示数据,真实表比这复杂得多] order表 订单明细表 xml映射表 <resultMap type="xxx.order" ...

  6. mybatis 高级映射和spring整合之高级映射(4)

    mybatis 高级映射和spring整合之高级映射 ----------------学习结构-------------------- 0.0 对订单商品数据模型进行分析 1.0 高级映射 1.1 一 ...

  7. mybatis0205 一对多查询 复杂

    查询所有用户信息,关联查询订单及订单明细信息及商品信息,订单明细信息中关联查询商品信息 1.1sql 主查询表:用户信息 关联查询:订单.订单明细,商品信息 SELECT orders.*, user ...

  8. mybatis0204 一对多查询

    查询所有订单信息及订单下的订单明细信息. sql语句 主查询表:订单表 关联查询表:订单明细 SELECT orders.*, user.username, user.sex , orderdetai ...

  9. Mybatis实现高级映射一对一、一对多查询

    终于把论文写得差不多了,系统也不急着完成,可以抽出点时间来完成这个系列的博客了.在写本博客之前我是惶恐不安的,高级映射一贯是持久层框架里的重中之重,小到自己开发小系统,大到企业级开发,表的存在从来就不 ...

随机推荐

  1. hdu 2844 Coins (多重背包)

    题意是给你几个数,再给你这几个数的可以用的个数,然后随机找几个数来累加, 让我算可以累加得到的数的种数! 解题思路:先将背包初始化为-1,再用多重背包计算,最后检索,若bb[i]==i,则说明i这个数 ...

  2. Spring3 MVC Login Interceptor(Spring 拦截器)

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. Thread学习

    1.定义 2.作用 3.和进程的比较 4.多线程(multithreading)的优点和缺陷 5.调度(scheduling) 6.线程相关概念 定义 线程就是最小的可编程指令序列,是进程的子集.一个 ...

  4. CMake 命令行设定编译环境

    笔者电脑安装了两个版本的VS(VS2012  和 VS2010),在使用CMake编译的时候,如果只在对应目录的命令行输入 "cmake .." 则系统会自动选择使用新版本(VS2 ...

  5. java堆栈 (转)

     Java栈与堆 ----对这两个概念的不明好久,最终找到一篇好文,拿来共享 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自己主动管理栈和堆, ...

  6. nginx学习七 高级数据结构之动态数组ngx_array_t

    1 ngx_array_t结构 ngx_array_t是nginx内部使用的数组结构.nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性.比方实际上存储数据的区域也是一大块连续的内存. ...

  7. 使用apache common-io 监控文件变化--转

    package common.io; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.common ...

  8. 大陆居民身份证验证方法(java)

    1.设置接口 @Constraint(validatedBy = ChineseIdNumberValidator.class) @Target({ElementType.METHOD, Elemen ...

  9. Content-type 对照表

    Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式.什么编码读取这个文件,比如用PHP输出图片文件.JSON数 ...

  10. deepin linux安装与配置

    作者:相思羽  出处:http://www.cnblogs.com/xiang-siyu 欢迎转载,也请保留这段声明.谢谢! deepin linux是由深度开发的操作系统,基于debian,内置了搜 ...