mybatis进阶--一对多查询

Posted 精品唯居

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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集合属性中。

以上是关于mybatis进阶--一对多查询的主要内容,如果未能解决你的问题,请参考以下文章

mybatis关联查询,一对一,一对多

MyBatis注解开发多表代码操作——手把手教你实战操作

mybatis 一对一关联 association 返回空值

阶段3 1.Mybatis_12.Mybatis注解开发_7 Mybatis注解开发一对多的查询配置

mybatis怎么一对多查询语句

mybatis--表关系之一对多