• mybatis系列-11-一对多查询


    11.1     需求

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

    11.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

    11.3     分析

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

     

      要求:

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

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

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

     

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

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

    11.4     在orders中添加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;

    11.5     mapper.xml

     <!-- 查询订单关联查询用户及订单明细,使用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>

    11.6     resultMap定义

        <!-- 订单及订单明细的resultMap
         使用extends继承,不用在中配置订单信息和用户信息的映射
         -->
        <resultMap type="Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
            <!-- 订单信息 -->
            <!-- 用户信息 -->
            <!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->
            <!-- 订单明细信息
            一个订单关联查询出了多条明细,要使用collection进行映射
            collection:对关联查询到多条记录映射到集合对象中
            property:将关联查询到多条记录映射到cn.itcast.mybatis.po.Orders哪个属性
            ofType:指定映射到list集合属性中pojo的类型
             -->
             <collection property="orderdetails" ofType="Orderdetail">
                <!-- id:订单明细唯 一标识
                property:要将订单明细的唯 一标识 映射到cn.itcast.mybatis.po.Orderdetail的哪个属性
                  -->
                <id column="orderdetail_id" property="id"/>
                <result column="items_id" property="itemsId"/>
                <result column="items_num" property="itemsNum"/>
                <result column="orders_id" property="ordersId"/>
             </collection>
    </resultMap>

    11.7     mapper.java

    /查询订单关联查询用户信息
    public List<Orders> findOrdersAndOrderDetailResultMap();

    11.8     小结

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

      使用resultType实现:

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

  • 相关阅读:
    大数据量下协同推荐的难点与优化方法
    几个常见的Mysql索引问题
    Orchard CMS -Migration文件更新后数据库不更新的问题 new properties not updating after migrationData migration is not working?
    一个可以设置中奖概率的抽奖程序[转]
    Implementing HTTPS Everywhere in ASP.Net MVC application.
    通过jQuery Ajax使用FormData对象上传文件
    SqlServer 数据去重
    向json中添加新的熟悉或对象 Add new attribute (element) to JSON object using JavaScript
    Dapper的基本使用,Insert、Update、Select、Delete
    DapperExtensions and Dapper.Contrib在表构架不是默认dbo时的处理 DapperExtensions and Dapper.Contrib with non-dbo Schema
  • 原文地址:https://www.cnblogs.com/ChinaHook/p/5532554.html
Copyright © 2020-2023  润新知