1. 程式人生 > >mybatis 實現關聯查詢的一對多和多對多查詢

mybatis 實現關聯查詢的一對多和多對多查詢

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();

    }

總結自傳智部落格燕青老師的視訊