【MyBatis框架】高級映射-多對多查詢

多對多查詢

1.需求
查詢用戶及用戶購買商品信息。

2.sql語句
查詢主表是:用戶表
關聯表:因爲用戶和商品沒有直接關聯,經過訂單和訂單明細進行關聯,因此關聯表:
orders、orderdetail、itemsjava

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

3.映射思路
將用戶信息映射到user中。
在user類中添加訂單列表屬性List<Orders> orderslist,將用戶建立的訂單映射到orderslist
在Orders中添加訂單明細列表屬性List<OrderDetail>orderdetials,將訂單的明細映射到orderdetials
在OrderDetail中添加Items屬性,將訂單明細所對應的商品映射到Items

4.mapper.xmlmysql

<!-- 查詢用戶及購買的商品信息,使用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>

5.resultMap定義sql

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

    <resultMap type="cn.edu.hpu.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 property="ordersList" ofType="cn.edu.hpu.mybatis.PO.Orders">
              <id column="id" property="id"/>
            <result column="user_id" property="userId"/>
            <result column="number" property="number"/>
            <result column="creattime" property="creattime"/>
            <result column="note" property="note"/>
            
            <collection property="orderdetils" ofType="cn.edu.hpu.mybatis.PO.Orderdetail"> 
                <!-- id:訂單明細的惟一標識 -->
                <id column="orderdetail_id" property="id"/>
                <result column="items_id" property="items_id"/>
                <result column="items_num" property="items_num"/>
                <result column="orders_id" property="orders_id"/>
            
                <association property="items" javaType="cn.edu.hpu.mybatis.PO.Items">
                    <id column="items_id" property="id"/>
                    <result column="items_name" property="name"/>
                    <result column="items_price" property="price"/>
                    <result column="items_detail" property="detail"/>
                </association>
            </collection>
          </collection>
          
    </resultMap>

6.mapper.javamybatis

package cn.edu.hpu.mybatis.mapper;


import java.util.List;


import cn.edu.hpu.mybatis.PO.Orders;
import cn.edu.hpu.mybatis.PO.OrdersCustom;
import cn.edu.hpu.mybatis.PO.User;


//訂單mapper
public interface OrdersCustomMapper {
    
    //...


    //查詢用戶及用戶商品信息
    public List<User> findUserAndItemsResultMap() throws Exception;
    
}

7.測試app

//查詢用戶及用戶購買的商品信息
@Test
    public void testFindUserAndItemsResultMap() throws Exception{
        
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //建立代理對象
        OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class);
        
        //調用mapper的方法
        List<User> list=ordersMapperCustom.findUserAndItemsResultMap();
        
        for (int i = 0; i < list.size(); i++) {
            User u=list.get(i);
            System.out.println("\n下單用戶:");
            System.out.println(u.getUsername()+"|"+u.getSex()+"|"+u.getAddress());
            System.out.println("訂單明細:");
            List<Orders> os=u.getOrdersList();
            if(os!=null){
                for (int j = 0; j < os.size(); j++) {
                    Orders order=os.get(j);
                    List<Orderdetail> ol=order.getOrderdetils();
                    for (int k = 0; k < ol.size(); k++) {
                        Orderdetail od=ol.get(k);
                        System.out.println("訂單明細id:"+od.getOrders_id()+
                                " 商品id:"+od.getItems_id()+" 訂單總數:"+od.getItems_num());
                        Items items=od.getItems();
                        System.out.println("商品詳細信息:\n"+" 商品id:"+items.getId()
                                +" 商品名稱:"+items.getName()+" 商品價格:"+items.getPrice()
                                +"\n商品詳細信息:"+items.getDetail());
                    }
                    
                }
            }
        }
        sqlSession.close();
    }

測試結果:
下單用戶:
張三|男|河南焦做
訂單明細:
訂單明細id:1 商品id:1 訂單總數:2
商品詳細信息:
 商品id:1 商品名稱:電視機 商品價格:2500.0
商品詳細信息:等離子電視機,液晶屏幕
訂單明細id:2 商品id:2 訂單總數:2
商品詳細信息:
 商品id:2 商品名稱:洗衣機 商品價格:1300.0
商品詳細信息:雙滾筒洗衣機,馬力十足


下單用戶:
劉莉莉|女|山東威海
訂單明細:
訂單明細id:3 商品id:3 訂單總數:1
商品詳細信息:
 商品id:3 商品名稱:電冰箱 商品價格:3200.0
商品詳細信息:雙拉門電冰箱,智能保鮮功能
測試

日誌輸出:代理

DEBUG [main] - Opening JDBC Connection  
DEBUG [main] - Created connection 29071960.  
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1bb9a58]  
DEBUG [main] - ==>  Preparing: 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   
DEBUG [main] - ==> Parameters:   
DEBUG [main] - <==      Total: 3

8.多對多查詢總結

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

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

一對可能是多對多的特例,以下需求:
查詢用戶購買的商品信息,用戶和商品的關係是多對多關係。
需求1:
查詢字段:用戶帳號、用戶名稱、用戶性別、商品名稱、商品價格(最多見)
企業開發中常見明細列表,用戶購買商品明細列表,
使用resultType將上邊查詢列映射到pojo輸出。

需求2:
查詢字段:用戶帳號、用戶名稱、購買商品數量、商品明細(鼠標移上顯示明細)
使用resultMap將用戶購買的商品明細列表映射到user對象中。

總結:
日誌

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

相關文章
相關標籤/搜索