mybatis 实现关联查询的一对多和多对多查询

原创 2015年07月24日 13:38:41

1.1  一对多查询

案例:查询所有订单信息及订单下的订单明细信息。

订单信息与订单明细为一对多关系。

使用resultMap实现如下:

1.1.1  Sql语句:三张表的关联查询  标红的分别为查询字段,查询的表,关联查询的条件

SELECT

  orders.*,

  user.username,

  user.address,

  orderdetail.idorderdetail_id,

  orderdetail.items_id,

  orderdetail.items_num

FROM

  orders, user, orderdetail

 

WHEREorders.user_id = user.id

AND orders.id = orderdetail.orders_id

1.1.2  定义po类 orderdetails 用来一对多的映射订单明细信息,明细信息映射到orderdetails集合中去

在Orders类中加入User属性。

Orders类中加入List<Orderdetail> orderdetails属性

1.1.3  Mapper.xml

<selectid="findOrdersDetailList"resultMap="userorderdetailmap">

    SELECT

    orders.*,

    user.username,

    user.address,

    orderdetail.id orderdetail_id,

    orderdetail.items_id,

    orderdetail.items_num

    FROM orders,user,orderdetail

    WHERE orders.user_id = user.id

    AND orders.id = orderdetail.orders_id

    </select>

 

1.1.4  定义resultMap association一对一映射collection一对多映射  cn.itcast.mybatis.po.Orders 查询主体  <id/>为关联查询的条件,既唯一标识; <result/>为查询的字段  

<!-- 订单信息resultmap -->

<resultMaptype="cn.itcast.mybatis.po.Orders"id="userorderdetailmap">

<idproperty="id"column="id"/>

<resultproperty="user_id"column="user_id"/>

<resultproperty="number"column="number"/>

<association property="user"javaType="cn.itcast.mybatis.po.User">

<idproperty="id"column="user_id"/>

<resultproperty="username"column="username"/>

<resultproperty="address"column="address"/>

</association>

<collection property="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">

    <idproperty="id"column="orderdetail_id"/>

    <resultproperty="items_id"column="items_id"/>

    <resultproperty="items_num"column="items_num"/>

</collection>

</resultMap>

 

collection部分定义了查询订单明细信息。

collection:表示关联查询结果集

property="orderdetails"关联查询的结果集存储在cn.itcast.mybatis.po.Orders上哪个属性。

ofType="cn.itcast.mybatis.po.Orderdetail"指定关联查询的结果集中的对象类型即List中的对象类型。

<id />及<result/>的意义同一对一查询。

 

1.1.4.1       resultMap使用继承

上边定义的resultMap中黄色部分和上一篇博客一对一查询订单信息的resultMap相同,在同一工程里使用继承可以不再填写重复的内容,如下:

<resultMaptype="cn.itcast.mybatis.po.Orders"id="userorderdetailmap"extends="userordermap">

<collectionproperty="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">

   <idproperty="id"column="orderdetail_id"/>

   <resultproperty="items_id"column="items_id"/>

   <resultproperty="items_num"column="items_num"/>

</collection>

</resultMap>

 

使用extends继承订单信息userordermap

1.1.5  Mapper接口:

public List<Orders>findOrdersDetailList() throws Exception;

1.1.6  测试:

Public void testfindOrdersDetailList()throws Exception{

       //获取session

       SqlSession session = sqlSessionFactory.openSession();

       //获限mapper接口实例

       UserMapper userMapper = session.getMapper(UserMapper.class);

       //查询订单信息

       List<Orders> list = userMapper.findOrdersDetailList();

       System.out.println(list);

       //关闭session

       session.close();

    }

 

1.2  多对多查询

1.2.1.1       需求

查询用户购买的商品信息。

1.2.1.2       sql

需要查询所有用户信息,关联查询订单及订单明细信息,订单明细信息中关联查询商品信息

四张表表的关联查询

 

SELECT

       orders.*,

       USER.username,

       USER.address,

       orderdetail.idorderdetail_id,

       orderdetail.items_id,

       orderdetail.items_num,

       items.nameitems_name,

       items.detailitems_detail

FROM

       orders,

       USER,

       orderdetail,

       items

WHERE

       orders.user_id =USER .id

AND orders.id = orderdetail.orders_id

AND orderdetail.items_id = items.id

1.2.1.3       po定义

         在User中添加List<Orders> orders 属性,在Orders类中加入List<Orderdetail> orderdetails属性

1.2.1.4       resultMap

 

需要关联查询映射的信息是:订单、订单明细、商品信息

订单:一个用户对应多个订单,使用collection映射到用户对象的订单列表属性中

订单明细:一个订单对应多个明细,使用collection映射到订单对象中的明细属性中

商品信息:一个订单明细对应一个商品,使用association映射到订单明细对象的商品属性中。

思路:

将用户信息映射到user中。

在user类中添加订单列表属性List<Orders> orderslist,将用户创建的订单映射到orderslist

在Orders中添加订单明细列表属性List<OrderDetail>orderdetials,将订单的明细映射到orderdetials

在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items

 

<!-- 一对多查询

    查询用户信息、关联查询订单、订单明细信息、商品信息

     -->

     <resultMap type="cn.itcast.mybatis.po.User"id="userOrderListResultMap">

        <idcolumn="user_id"property="id"/>

       <resultcolumn="username"property="username"/>

        <collectionproperty="orders"ofType="cn.itcast.mybatis.po.Orders">

          <id column="id"property="id"/>

          <resultproperty="number"column="number"/>

            <collectionproperty="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">

                <id column="orderdetail_id"property="id"/>

               <resultproperty="ordersId"column="id"/>

               <resultproperty="itemsId"column="items_id"/>

               <resultproperty="itemsNum"column="items_num"/>

               <associationproperty="items"javaType="cn.itcast.mybatis.po.Items">

                   <idcolumn="items_id"property="id"/>

                   <resultcolumn="items_name"property="name"/>

                   <resultcolumn="items_detail"property="detail"/>

              </association>

           </collection>

       </collection>

     </resultMap>

1.2.1.5       mapper.Xml

   <!-- 查询用户及购买的商品信息 -->

   <selectid="findUserAndItemsResultMap"resultMap="UserAndItemsResultMap">

   SELECTorders.* ,

      user.username, user.sex , user.address ,

      orderdetail.orders_id, orderdetail.items_id , orderdetail.items_num , orderdetail.id orderdetail_id,

      items.nameitems_name , items.detail items_detail , items.price  items_price

   FROM  orders ,USER , orderdetail , items

   WHEREorders.user_id=user.id AND orderdetail.orders_id = orders.id AND orderdetail.items_id=items.id

   </select>

1.2.1.6   mapper接口

//查询用户购买的商品信息

public List<User> findUserAndItemsResultMap()throwsxception;

1.2.1.7   测试通过resultMap去重打印

//查询用户购买的商品信息

    @Test

    public voidtestFindUserAndItemsResultMap() throwsException{

    SqlSessionsqlSession=sqlSessionFactory.openSession();

      

    OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class);

   

    List<User>list=ordersMapperCustom.findUserAndItemsResultMap();

    Stringresult="";

    for(inti=0;i<list.size();i++)

    {  

       result="用户 "+list.get(i).getUsername();

       for(intj=0;j<list.get(i).getOrderList().size();j++)

       {

           result=result+"订单id "+list.get(i).getOrderList().get(j).getId();

           for(intk=0;k<list.get(i).getOrderList().get(j).getOrderdetails().size();k++)

           {

              result=result+"    "+list.get(i).getOrderList().get(j).getOrderdetails().get(k).getItems().getName()+"价格 "+

                      +list.get(i).getOrderList().get(j).getOrderdetails().get(k).getItems().getPrice();            

           }     

       }

       System.out.println(result);//去重

    }

   

    sqlSession.close();

    }

总结自传智博客燕青老师的视频

版权声明:本文为博主编写文章,未经博主允许转载,转载请注明出处。

相关文章推荐

MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)

MyBitis(iBitis)系列随笔之一:MyBitis入门实例 MyBitis(iBitis)系列随笔之二:类型别名(typeAliases)与表-对象映射(ORM) MyBitis(iBit...

MyBatis之一对多关联查询

MyBatis一对多关联

MyBatis(三)---实现一对一和一对多的关联表查询

(1) 一对一的关联表查询 新建class表和teacher表,表结构如下: class: teacher: 在两张表里面填写一些数据:               数据库准备工作完成后,新...

mybatis关联查询问题(一对多、多对一)

mybatis 提供了高级的关联查询功能,一对多,多对多,多对一

MyBatis 多表联合查询及优化

序 这篇文章我打算来简单的谈谈 mybatis 的多表联合查询。起初是觉得挺简单的,没必要拿出来写,毕竟 mybatis 这东西现在是个开发的都会用,而且网上的文章也是一搜罗一大堆,根本就用不着我...

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

mybatis中一对一,一对多,多对多的处理: http://www.cnblogs.com/yaobolove/p/5444046.html http://www.360doc.com/co...

【mybatis】关联查询——mybatis一对多两种方式实现详解

一、数据库         演示的小demo涉及两张表,一张是Person表,记录用户基本信息,另一张是phone表,记录电话号码,Person的phoneID外键关联phone表id。此处示例涉及并...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

【SSM-MyBatis框架】关联查询--多对多查询

1. 需求:        查询用户及用户购买商品的信息:    2.映射思路:      将用户信息映射到user中。     在user中添加List orderList属性,将用...

mybatis学习笔记(12)-多对多查询

本文实现多对多查询,查询用户及用户购买商品信息。示例查询主表是:用户表关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表:orders、orderdetail、items...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mybatis 实现关联查询的一对多和多对多查询
举报原因:
原因补充:

(最多只允许输入30个字)