• mybatis进阶--一对多查询


      首先,我们还是先给出一个需求:根据订单id查询订单明细——我们知道,一个订单里面可以有多个订单的明细(需求不明确的同学,请留言或者去淘宝网上的订单处点一下就知道了)。这个时候,一个订单,对应多个订单的id。这种需求出现的时候,我们应该如何查询呢?

      此时我们的数据模型如下图(左)由于查询用户也是我们的需求,所以就在原有的基础上进行扩展,数据模型如下(右):

        很显然,如果用resultType的方式去实现的话,是不合理的了。因为我们需要创建一个既有订单又有订单明细的pojo然后呢,我们的mybatis框架会为我们映射出很多个pojo对象(有多少个订单明细就有多少个对象)。

        所以我们需要使用resultMap的方式进行处理。解决问题的思路是:在orders类中增加一个订单明细的List字段将list的类型定义为Orderdetail类型。然后通过配置文件,将得到的数据,通过resultMap的collection标签进行映射到list中。

        具体实现如下:

      sql语句

        确定主查询表:订单表

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

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

        

    复制代码
     1 SELECT 
     2   orders.*,
     3   USER.username,
     4   USER.sex,
     5   USER.address,
     6   orderdetail.id orderdetail_id,
     7   orderdetail.items_id,
     8   orderdetail.items_num,
     9   orderdetail.orders_id
    10 FROM
    11   orders,
    12   USER,
    13   orderdetail
    14 WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
    复制代码

      问题展示

        查询完毕以后,我们发现了一个问题:如图所示,我们的id出现了多条,这是因为数据库中对应的多个订单详情共同使用一个订单id导致的。这就导致了每条记录中都会出现一个orders的记录。具体解决办法,开始的时候就说了,这里就不再赘述了。

        

      在orders中添加list订单明细属性

        

        定义resultMap

    复制代码
     1 <!-- 订单及订单明细的resultMap
     2     使用extends继承,不用再重复用户的映射
     3      -->
     4     <resultMap type="cn.itcast.mybatis.po.Orders" id="dinxtends="OrdersUserResultMap">
     5         <!-- 订单信息 -->
     6         <!-- 用户信息 -->
     7         <!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->
     8         
     9         
    10         <!-- 订单明细信息
    11         一个订单关联查询出了多条明细,要使用collection进行映射
    12         collection:对关联查询到多条记录映射到集合对象中
    13         property:将关联查询到多条记录映射到cn.itcast.mybatis.po.Orders哪个属性
    14         ofType:指定映射到list集合属性中pojo的类型
    15          -->
    16          <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
    17              <!-- id:订单明细唯 一标识
    18              property:要将订单明细的唯 一标识 映射到cn.itcast.mybatis.po.Orderdetail的哪个属性
    19                -->
    20              <id column="orderdetail_id" property="id"/>
    21              <result column="items_id" property="itemsId"/>
    22              <result column="items_num" property="itemsNum"/>
    23              <result column="orders_id" property="ordersId"/>
    24          </collection>
    25         
    26     
    27     </resultMap>
    复制代码

        statement定义

        

      mapper

        

      总结

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

  • 相关阅读:
    分享:liblfds 6.1.0 发布,C 数据结构库
    strchr C++ Reference
    爱上MVC3系列~PartialView中的页面重定向
    基础才是重中之重~Conditional特性使代码根据条件在debug或者release模式中执行
    爱上MVC3系列~Html.BeginForm与Ajax.BeginForm
    爱上MVC3系列~Razor页面中的共享namespace不起作用了(解决自定义扩展方法不能识别的问题)
    爱上MVC3系列~RenderAction与RenderPartial及一个页面多个表单提交
    NHibernate Criteria中的And, Or
    poj 2528 Mayor's posters(线段树区点)
    探索iptables BPF模块的悲惨历程
  • 原文地址:https://www.cnblogs.com/zhangyuhang3/p/6901108.html
Copyright © 2020-2023  润新知