美文网首页Java Web程序员java
mybatis高级映射一对多查询实现

mybatis高级映射一对多查询实现

作者: 城东那个小丑 | 来源:发表于2017-03-16 15:57 被阅读1191次

1.需求分析:


在开发中会遇到这样一个问题,查询订单信息,级联查询出用户信息和订单明细信息


2.sql语句实现


2.1确定主查询表:订单表
2.2确定关联查询表:用户表, 订单明细表
sql语句如下:

 select
     orders.*,
     t_user.address,
     t_user.name,
     t_user.brithday,
     orderdetail.id orderdetail_id,
     orderdetail.orderid,
     orderdetail.itemsid
      from
      orders,
      t_user,
      orderdetail
      where 
    orders.userid=t_user.id AND orderdetail.orderid=orders.id;

查询结果如下:

选区_001.png

映射要求:

不能出现重复的订单信息


3.编码实现

在orders.java中添加属性,List<OrdersDetail> ordersDetails 。类比hibernate学习,代码如下:

public class Orders {
    private int id;
    private String note;
    private Date dateTime;
    private String number;
    private int userId;
    private User user;
    private List<OrdersDetail> ordersDetails;//看这里
}

最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders的ordersDetails集合中,从上面查询结果图中可以看出最终的订单信息将为2条(orders信息不重复),每个订单orders中的属性存储了该订所对应的订单明细。

4.编写mapper.java和mapper.xml文件

代码如下:

package com.djp.config.mapper;


import com.djp.pojo.Orders;
import com.djp.pojo.OrdersCustom;

import java.util.List;

public interface OrdersCustomMapper {
    /**
     * 查询订单关联查询用户信息和订单明细信息
     *
     * @return
     */
    List<Orders> findOrderAndOrderDetailResultMap();

    /**
     * 查询订单关联查询用户信息
     *
     * @return
     */
    List<OrdersCustom> findOrderUser() throws Exception;

    /**
     * 使用resultMap映射
     *
     * @return
     * @throws RuntimeException
     */
    List<Orders> findOrderUserResultMap() throws RuntimeException;
}

对于mapper.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="com.djp.config.mapper.OrdersCustomMapper">
    <!--订单查询关联用户和订单明细的信息的resultMap-->
    <resultMap id="orderAndOrderDetailResultMap" type="orders" extends="ordersUserResultMap">
        <!--配置订单信息 使用继承下面的-->
        <!--配置订单关联的用户信息 使用继承下面的-->
         <!--配置订单关联的订单明细信息
             一条订单关联查询出了多条明细,要使用collection进行映射
             collection :对关联查询到多条记录映射到集合中
             property:将关联查询到的多条记录映射到com.djp.pojo.Orders中的哪个属性
             ofType:指定映射到list集合属性中的pojo的类型
         -->
        <collection property="ordersDetails" ofType="OrdersDetail">
            <!--
                id:订单明细的唯一标示
                property:将订单明细的唯一标示映射到com.djp.pojo.OrdersDetail中的哪个属性
            -->
            <id column="orderdetail_id" property="id"/>
            <result column="orderid" property="orderId"/>
            <result column="itemsid" property="itemsId"/>
        </collection>
    </resultMap>
    <!--查询订单明细关联查询用户信息和订单明细信息的statement-->
    <select id="findOrderAndOrderDetailResultMap" resultMap="orderAndOrderDetailResultMap">
    select
     orders.*,
     t_user.address,
     t_user.name,
     t_user.brithday,
     orderdetail.id orderdetail_id,
     orderdetail.orderid,
     orderdetail.itemsid
      from
      orders,
      t_user,
      orderdetail
      where
      orders.userid=t_user.id AND orderdetail.orderid=orders.id
    </select>
    <!--订单查询关联用户的resultMap
        将整个查询结果映射到com.djp.pojo.Orders中
    -->
    <resultMap id="ordersUserResultMap" type="com.djp.pojo.Orders">
        <!--配置映射的订单信息
            result:普通列
            id:指定查询列中的唯一标示,订单信息中的唯一标示,如果有多个列组成多个唯一标示,配置多个id
            column:订单信息的唯一标示
            property:订单信息的唯一标示,列所映射到Orders中的哪个属性
        -->
        <id column="id" property="id"/>
        <result column="note" property="note"/>
        <result column="dateTime" property="dateTime"/>
        <result column="number" property="number"/>
        <result column="userId" property="userId"/>
        <!--配置订单关联的用户信息
            association:用于映射关联查询单个用户的信息
            property:将要关联查询的用户信息映射到orders中的哪个属性
            javaType:指定的类型,可以使用别名
        -->
        <association property="user" javaType="user">
            <!--
                id :关联查询用户的唯一标示
               column:指定表示用户信息的列
               property:对应user.java中的哪个属性
            -->
            <id column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="pwd" property="pwd"/>
            <result column="address" property="address"/>
            <result column="brithday" property="brithday"/>
        </association>
    </resultMap>
    <!-- 查询订单关联查询用户信息 使用resultMap-->
    <select id="findOrderUserResultMap" resultMap="ordersUserResultMap">
select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id
    </select>
    <!--查询订单关联查询用户信息-->
    <select id="findOrderUser" resultType="OrdersCustom">
select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id
    </select>
</mapper>

代码有点多,不怕得,下面的是之前的一对一的,注意继承至之前写好的resultMap。

5 写测试代码:

 /**
     * 查询订单关联查询用户信息和订单明细信息
     */
    @Test
    public void testFindOrderAndOrderDetailResultMap() {
        try {
            System.out.println("start.................");
            //通过得到的SqlSessionFactory打开回话sqlSession
            SqlSession sqlSession = SqlSessionFactory.openSession();
            //通过会话得到用户的代理
            OrdersCustomMapper ordersCustomMapper = sqlSession.getMapper(OrdersCustomMapper.class);
            List<Orders> list = ordersCustomMapper.findOrderAndOrderDetailResultMap();
                for (Orders item : list) {
                System.out.println("订单+用户+订单明细:"+item);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


运行结果如下:


关联查询.png

从图中可看出我们需要的订单信息,关联查询出的用户信息,关联查询出的订单明细信息都出来了!

6 .总结

mybatis使用resultMap实现一对多查询用collection对关联查询出的多条记录映射到一个list集合中

相关文章

  • mybatis

    mybatis 高级映射 一对一 一对多 mybatis generator 的使用 多个条件 or 连接查询 但...

  • mybatis高级映射一对多查询实现

    1.需求分析: 在开发中会遇到这样一个问题,查询订单信息,级联查询出用户信息和订单明细信息 2.sql语句实现 2...

  • mybatis高级映射——(一对多查询)

    1.当一对多查询时可能会出现如下情况 2.编码实现 要不能出现重复学生信息 在StudentBean.java中添...

  • SSM框架的常用注解整理

    一.mybatis 1 配置一对多查询和多对多查询的注解方式映射关系: @Results:声明映射关系的配置 Va...

  • mybatis高级映射多对多查询实现

    1.同以前一样,首先给一个使用多对多的需求, 要查询用户以及用户所购买的商品信息,经过分析用户和商品数据库级别没有...

  • Django-关系映射

    关系映射 一对一映射 语法 查询 一对多映射 语法 查询 多对多映射 语法 查询 自定义查询对象

  • J2EE进阶学习——Mybatis(七):高级映射 查询缓存

    对订单商品数据模型进行分析。 1.高级映射: 实现一对一、一对多、多对多查询延迟加载 2.查询缓存 一级缓存二级缓...

  • Mybatis学习笔记(四):映射器介绍(下)

    本文档讲述MyBatis映射器较为高级的部分。 级联 级联是resultMap中的配置,用来实现一对一或一对多的连...

  • MyBatis

    MyBatis 理论篇 [TOC] 什么是MyBatis  MyBatis是支持普通SQL查询,存储过程和高级映射...

  • Mybatis

    Mybatis 介绍MyBatis是支持普通 SQL 查询,存储过程和高级映射的优秀持久 层框架。MyBatis ...

网友评论

本文标题:mybatis高级映射一对多查询实现

本文链接:https://www.haomeiwen.com/subject/ofhjnttx.html