mybatis學習筆記(12)-多對多查詢

mybatis學習筆記(12)-多對多查詢

標籤: mybatis前端


[TOC]java


本文實現多對多查詢,查詢用戶及用戶購買商品信息。git

示例

查詢主表是:用戶表github

關聯表:因爲用戶和商品沒有直接關聯,經過訂單和訂單明細進行關聯,因此關聯表:orders、orderdetail、itemssql

  • sql
SELECT 
  orders.*,
  user.username,
  user.sex,
  user.address,
  orderdetail.id orderdetail_id,
  orderdetail.items_id,
  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中。mybatis

在user類中添加訂單列表屬性List<Orders> orderslist,將用戶建立的訂單映射到orderslistapp

在Orders中添加訂單明細列表屬性List<OrderDetail>orderdetials,將訂單的明細映射到orderdetials學習

在OrderDetail中添加Items屬性,將訂單明細所對應的商品映射到Items網站

  • mapper.xml
<!-- 查詢用戶及購買的商品信息,使用resultmap -->
<select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
   SELECT
      orders.*,
      user.username,
      user.sex,
      user.address,
      orderdetail.id orderdetail_id,
      orderdetail.items_id,
      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
</select>
  • resultMap
<!-- 查詢用戶及購買的商品 -->
<resultMap type="com.iot.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="com.iot.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="com.iot.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="com.iot.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>
  • mapper.java
//查詢用戶購買商品信息
public List<User>  findUserAndItemsResultMap()throws Exception;

多對多查詢總結

將查詢用戶購買的商品信息明細清單,(用戶名、用戶地址、購買商品名稱、購買商品時間、購買商品數量).net

針對上邊的需求就使用resultType將查詢到的記錄映射到一個擴展的pojo中,很簡單實現明細清單的功能。

一對可能是多對多的特例,以下需求:

查詢用戶購買的商品信息,用戶和商品的關係是多對多關係。

  • 需求1:

查詢字段:用戶帳號、用戶名稱、用戶性別、商品名稱、商品價格(最多見)

企業開發中常見明細列表,用戶購買商品明細列表,

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

  • 需求2:

查詢字段:用戶帳號、用戶名稱、購買商品數量、商品明細(鼠標移上顯示明細)

使用resultMap將用戶購買的商品明細列表映射到user對象中。

總結:

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

resultMap總結

  • resultType

    • 做用:將查詢結果按照sql列名pojo屬性名一致性映射到pojo中。
    • 場合:常見一些明細記錄的展現,好比用戶購買商品明細,將關聯查詢信息所有展現在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)便可。
  • resultMap

使用association和collection完成一對一和一對多高級映射(對結果有特殊的映射要求)。

association:

  • 做用:將關聯查詢信息映射到一個pojo對象中。
  • 場合:爲了方便查詢關聯信息可使用association將關聯訂單信息映射爲用戶對象的pojo屬性中,好比:查詢訂單及關聯用戶信息。

使用resultType沒法將查詢結果映射到pojo對象的pojo屬性中,根據對結果集查詢遍歷的須要選擇使用resultType仍是resultMap。

collection:

  • 做用:將關聯查詢信息映射到一個list集合中。
  • 場合:爲了方便查詢遍歷關聯信息可使用collection將關聯信息映射到list集合中,好比:查詢用戶權限範圍模塊及模塊下的菜單,可以使用collection將模塊映射到模塊list中,將菜單列表映射到模塊對象的菜單list屬性中,這樣的做的目的也是方便對查詢結果集進行遍歷查詢。若是使用resultType沒法將查詢結果映射到list集合中。

做者@brianway更多文章:我的網站 | CSDN | oschina

相關文章
相關標籤/搜索