MyBatis总结之高级映射一对多查询

上一篇博文总结了一下一对一的映射,本文主要总结一下一对多的映射,订单项和订单明细是一对多的关系,所以本文主要来查询订单表,然后关联订单明细表,这样就有一对多的问题出来了。

  首先还是先写sql语句,在写sql语句的时候遵循两点:

查询的主表是哪个? 订单表

查询的关联表是哪个? 订单明细表

  明确了主表和关联表,下面就可以写sql了,我们在上一节的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 orders.`id` = orderdetail.`orders_id`

  这样我们就查询出了订单表中的所有字段,user表和orderdetail表的部分字段,当然也可以查询所有字段,这个根据具体需求来定。

  从结果中可以看出,订单的信息有重复,订单项是不重复的,因为一对多嘛,这很好理解。所以如果我们用resultType来做映射的话就会出现订单信息的重复,我们不希望出现这个结果,即对orders的映射不能出现重复记录的情况。那么我们就需要在Orders.java类中添加一个List<OrderDetail> orderDetails属性来封装订单明细项(比较简单,代码就不贴了),最终会将订单信息映射到Orders中,该订单所对应的订单明细映射到Orders中的orderDetails属性中(这跟hibernate中有点类似,如果是hibernate,也会在Orders类中维护一个装OrderDetail的List)。

  有了这个思路,接下来就开始写映射文件了。

<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 orders.`id` = orderdetail.`orders_id`

</select>

  所以我们要定义一个名为OrdersAndOrderDetailResultMap的resultMap,如下:

<resultMap type="mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">

<!-- 配置映射订单信息和关联的用户信息和上面的一样,继承上面的即可 -->

<!-- 配置关联的订单明细信息 -->

<collection property="orderdetails" ofType="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>

  这里看到了一个继承,因为订单信息和关联的用户信息和前面一对一是完全一样的,我们就不需要再写一遍了,<resultMap>支持继承,直接继承那个resultMap即可,然后加上订单明细这部分即可。

  <collection>是用来处理一对多映射的标签,property属性是Orders.java类中对应的装OrderDetail的List的属性名,就是刚刚定义的那个List,ofType属性表示该List中装的是啥,可以是完全限定名,也可以是别名。然后<collection>里面的标签和属性就和前面一样了,不再赘述。

  然后定义一下mapper接口即可:

public interface UserMapperOrders {

//查询订单(关联用户)及订单明细

public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;

}

原文地址:https://www.cnblogs.com/fswhq/p/MyBatis_one2many.html

时间: 2024-10-31 11:20:42

MyBatis总结之高级映射一对多查询的相关文章

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

从这一篇博文开始,将总结一下mybatis中的几个高级映射,即一对一.一对多.多对多查询,这篇先总结一下mybatis中的一对一查询. 为了模拟这些需求,事先要建立几个表,不同的表之间将对应上面提到的不同的映射,为此,我建立4个表,如下: DROP TABLE IF EXISTS `items`; DROP TABLE IF EXISTS `orders`; DROP TABLE IF EXISTS `user`; DROP TABLE IF EXISTS `orderdetail`; /*it

【MyBatis框架】高级映射-延迟加载

延迟加载1.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能.需求:如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 延迟加载:先从单表查询.需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 2.使用association实现

MyBatis的对象关系映射---一对多N+1策略★★★★★

在实际开发中,一个业务可能涉及到多个数据表的查询,那么多表查询就涉及连接查询(等值连接), 等值连接 表与表之间有一个外键关键,但是程序中最终获取的表封装的对象, 对象与对象之间是没有外键关系的,对象和对象之间只有依赖关系: 对象之间关系主要是四种: 一对一 关系一个人对应身份证id,一个QQ号对应一个QQ空间 一对多 关系 一个部门对应多个员工 多对一 关系 多个员工对应一个部门 多对多 关系 多个学生对应多个老师,多个学生对应多个课程 什么关系应该从哪个对象作为中心点来看 一对多, 以one

MyBatis的对象关系映射---一对多等值连接策略★★★★★

在实际开发中,一个业务可能涉及到多个数据表的查询,那么多表查询就涉及连接查询(等值连接), 等值连接 表与表之间有一个外键关键,但是程序中最终获取的表封装的对象, 对象与对象之间是没有外键关系的,对象和对象之间只有依赖关系: 对象之间关系主要是四种: 一对一 关系一个人对应身份证id,一个QQ号对应一个QQ空间 一对多 关系 一个部门对应多个员工 多对一 关系 多个员工对应一个部门 多对多 关系 多个学生对应多个老师,多个学生对应多个课程 什么关系应该从哪个对象作为中心点来看 一对多, 以one

MyBatis应用开发(14)映射之嵌套查询

1.1.1. 嵌套查询 使用association结点的select属性可以建立嵌套查询.前文介绍的不使用select的方法在主表结果记录集包含N条记录,每个记录对应1条子表记录的情况下,总共执行一条SQL语句就可以满足整个查询操作的要求,而本文介绍的select属性建立嵌套查询的方法,则 需要执行1+N条SQL语句(单向关联),或者1+N*2条语句(双向关联). Mapper配置: <!-- 主表resultMap:Person和IdCard的一对一关联:双向关联,嵌套查询 --> <

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

[数据库模型] [各个表] [ 用户表user ] 购买商品的用户信息. [ 订单表 ] 用户所创建的订单 [ 订单明细表 ] 订单的详细信息,即购买商品的信息 [ 商品表 ] 商品的具体信息 [有关系的表之间的业务关系] 分析表与表之间的业务关系时,需要建立在某个业务意义的基础之上去分析. [ user 与 orders ] user ---> orders :一个用户可以创建多个订单, 一对多 orders ---> user :一个订单只能由一个用户创建,一对一 [ orders与ord

mybatis0205 一对多查询 复杂

查询所有用户信息,关联查询订单及订单明细信息及商品信息,订单明细信息中关联查询商品信息 1.1sql 主查询表:用户信息 关联查询:订单.订单明细,商品信息 SELECT orders.*, user.username, user.sex , orderdetail.id orderdetail_id, orderdetail.items_num, orderdetail.items_id, items.name items_name, items.detail items_detail FRO

Mybatis深入了解(六)----关联查询(高级映射)

一对一查询 resultType resultMap 一对多查询 resultType resultMap 多对多查询 一对一查询 resultType resultType:使用resultType实现非常简单,如果POJO中没有包括查询的列名,可以新建扩展类继承父类,并在子类中添加列名对应的属性,即可完成映射. package cn.itcast.ssm.po; /** * 订单的扩展类 * @author Administrator * */ //通过此类映射订单和用户查询的结果,让此类继

mybatis入门基础(六)----高级映射(一对一,一对多,多对多)

一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(32) NOT NULL COMMENT '商品名称', 4 price FLOAT(10,1) NOT NULL COMMENT '商品定价', 5 detail TEXT COMMENT '商品描述', 6 pic VARCHAR(64) DEFAULT NULL COMMENT