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

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

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

  1. 查询的主表是哪个? 订单表
  2. 查询的关联表是哪个? 订单明细表

  明确了主表和关联表,下面就可以写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;

}

  到此位置,一对多的映射就写好了,下面测试一下:

@Test
public void testFindOrdersAndOrderDetailResultMap() throws Exception {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapperOrders userMapperOrders = sqlSession.getMapper(UserMapperOrders.class);
    List<Orders> list = userMapperOrders.findOrdersAndOrderDetailResultMap();
    System.out.println(list);
}

  一对多就总结到这吧,下一篇博文将总结一下mybatis中多对多映射。

  

  相关阅读:http://blog.csdn.net/column/details/smybatis.html

  学习笔记源码下载地址:https://github.com/eson15/MyBatis_Study



—–乐于分享,共同进步!

—–我的博客主页:http://blog.csdn.net/eson_15

时间: 2024-10-12 19:50:24

【MyBatis学习09】高级映射之一对多查询的相关文章

【MyBatis学习10】高级映射之多对多查询

本文来总结一下mybatis中的多对多映射,从第8节的文章中可以看出,用户表和商品表示多对多关系,它们两的多对多是通过订单项和订单明细这两张表所关联起来的,那么这一节主要来总结一下用户表和商品表之间的多对多映射. 首先在上一节的基础上继续写sql, SELECT orders.*, user.`username`, user.`sex`, user.`address`, orderdetail.`id` orderdetail_id, orderdetail.`items_id`, orderd

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

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

19_高级映射:一对多查询(使用resultMap)

[需求] 查询订单以及订单明细的信息. 确定主查询表:订单表orders 确定关联查询表:订单明细表 orderdetail 在一对一查询的基础上添加订单明细表关联即可. [分析] 使用resultMap将上面的查询结果映射到pojo中,订单信息有重复. 要求:对orders映射不能出现重复记录 在orders.java类中添加List<orderDetail> orderDetails属性. 最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetai

MyBatis学习15-MyBatis输入映射

1.通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型: 2.传递pojo的包装对象 完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息.其它信息,比如商品.订单的),针对这个需求,建议使用自定义的包装类型的pojo,在包装类型的pojo中将复杂的查询条件包装进去.po是持久层的对象,vo是视图层(表现层)的对象,pojo是自定义的类似于po或vo的综合体的简单Java bean. package po; //User的扩展类p

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

上一篇博文总结了一下一对一的映射,本文主要总结一下一对多的映射,订单项和订单明细是一对多的关系,所以本文主要来查询订单表,然后关联订单明细表,这样就有一对多的问题出来了. 首先还是先写sql语句,在写sql语句的时候遵循两点: 查询的主表是哪个? 订单表 查询的关联表是哪个? 订单明细表 明确了主表和关联表,下面就可以写sql了,我们在上一节的sql基础上添加订单明细表的关联即可. SELECT orders.*, user.`username`, user.`sex`, user.`addre

mybatis学习------打包xml映射文件

编译mybatis时,idea不会将mybatis的xml映射文件一起打包进jar,即在编译好的jar包里缺少mybatis映射文件,导致网站加载失败 为解决这个问题,可在mybatis对应module的pom.xml中,找到<build></build>,,在其中添加如下代码即可. <!--将mybatis的xml映射文件一起进行打包--> <resources> <resource> <directory>src/main/jav

Mybatis学习--Mapper.xml映射文件

JAVA%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%BC%96%E7%A8%8B%E2%80%94%E2%80%94JAVA%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B [email protected]?????? http://auto.315che.com/baowobx7/qa23474433.htm?9n http://auto.315che.com/weizhi/qa23935473.htm?x7 http://auto.315che.c

20_高级映射:多对多查询

[需求] 查询用户及用户购买的商品信息. [SQL语句] 查询主表:用户user表 关联表:由于用户和商品没有直接关联,需通过订单和订单明细进行关联,所以关联的表是 orders.orderdetail.items [映射的思路] 将用户信息映射到user中. 在user类中添加订单列表属性List<Orders> orderlist,将用户创建的订单映射到orderslist. 在Orders中添加订单明细列表属性List<OrderDetail> orderdetails,将订

三、MyBatis系列:Mapper 映射 之 多级关联查询结果映射

现在有这么几张表,员工表(user).订单(orders).订单明细(orderdetails).产品信息(items)它们的物理模型图如下: 希望能查询出某些用户下的订单详细信息,而且希望能一条SQL查出所有相关的数据,并映射到POJO实体中.返回的结果应该包含用户信息.订单及明细.相应产品信息.数据映射为实体结构如下: 1 package cn.xleos.mybatis.po; 2 3 public class User { 4 private int id; 5 private Stri