1. 程式人生 > >【mybatis】多對多查詢

【mybatis】多對多查詢

多對多查詢

需求

查詢使用者及使用者購買商品資訊。

sql語句

查詢主表是:使用者表 user

關聯表:由於使用者和商品沒有直接關聯,通過訂單和訂單明細進行關聯,所以關聯表是:

orders、orderdetail、items

SELECT

  orders.*,//order表的唯一標識 user表的唯一標識

  USER.username,

  USER.sex,

  USER.address,

  orderdetail.id orderdetail_id,//orderdetail表的唯一標識

  orderdetail.items_id,//items表的唯一標識

  orderdetail.items_num,

  orderdetail.orders_id,

  items.name items_name,

  items.detail items_detail,

  items.price items_price

FROM

  orders,

  USER,

  orderdetail,

  items

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

對映思路:

將使用者資訊對映到user中。

在user類中新增訂單列表屬性List<Orders> orderslist,將使用者建立的訂單對映到orderslist

在Orders中新增訂單明細列表屬性List<OrderDetail>orderdetials,將訂單的明細對映到orderdetials 

在OrderDetail中新增Items屬性,將訂單明細所對應的商品對映到Items

mapper.xml

resultMap定義

<!-- 查詢使用者及購買的商品 -->

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

      <!-- 使用者資訊 -->

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

      <result column="username" property="username"/>

      <result column="sex" property="sex"/>

      <result column="address" property="address"/>

     

      <!-- 訂單資訊

      一個使用者對應多個訂單,使用collection對映

       -->

       <collection property="ordersList" ofType="cn.itcast.mybatis.po.Orders">

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

         <result column="user_id" property="userId"/>

         <result column="number" property="number"/>

         <result column="createtime" property="createtime"/>

         <result column="note" property="note"/>

          <!-- 訂單明細

       一個訂單包括 多個明細

        -->

        <collection property="orderdetails" ofType="cn.itcast.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"/>

               <!-- 商品資訊

        一個訂單明細對應一個商品

         -->

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

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

              <result column="items_name" property="name"/>

              <result column="items_detail" property="detail"/>

              <result column="items_price" property="price"/>

           </association>

        </collection>

       </collection>

   </resultMap>

一對多使用collection對映,一對一使用association對映 

當A屬性包含在B類內部,相應的,A對映要寫在B對映的內部。

mapper.java

多對多查詢總結

需求:查詢使用者購買的商品資訊明細清單,(使用者名稱、使用者地址、購買商品名稱、購買商品時間、購買商品數量)

只是將清單簡單的列出來,而沒有其他特殊需求的話,使用resultType就可以解決。上邊的需求就使用resultType將查詢到的記錄對映到一個擴充套件的pojo中,很簡單實現明細清單的功能。

一對多是多對多的特例,如下需求:

查詢使用者購買的商品資訊,使用者和商品的關係是多對多關係。

需求1:

查詢欄位:使用者賬號、使用者名稱稱、使用者性別、商品名稱、商品價格(最常見)、

使用resultType將上邊查詢列對映到pojo輸出。

需求2:

查詢欄位:使用者賬號、使用者名稱稱、購買商品數量、商品明細(滑鼠移動顯示明細列表)

使用resultMap將使用者購買的商品明細列表對映到user物件中。

總結:

使用resultMap是針對那些對查詢結果對映有特殊要求的功能,,比如特殊要求對映成list中包括 多個list。