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

前面學習了一對一的查詢,如今咱們在剛纔的數據模型基礎上進行一對多的查詢。

一對多查詢

1.需求
查詢訂單及訂單明細的信息。

2.sql語句
肯定主查詢表:訂單表
肯定關聯查詢表:訂單明細表
在一對一查詢基礎上添加訂單明細表關聯便可。html

SELECT 
  orders.*,
  USER.username,
  USER.sex,
  USER.address,
  orderdetail.id orderdetail_id,
  orderdetail.items_id,
  orderdetail.items_num,
  orderdetail.orders_id
FROM
  orders,
  USER,
  orderdetail
WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id

3.分析
使用resultType將上邊的 查詢結果映射到pojo中,訂單信息的就是重複。
java

如圖mysql



要求:
對orders映射不能出現重複記錄。

4.在orders中添加list訂單明細屬性

在orders.java類中添加List<orderDetail> orderDetails屬性。
最終會將訂單信息映射到orders中,訂單所對應的訂單明細映射到orders中的orderDetails屬性中。
sql

package cn.edu.hpu.mybatis.PO;

import java.util.Date;
import java.util.List;

public class Orders {

    private Integer id;
    
    private Integer userId;
    
    private String number;
    
    private Date creattime;
    
    private String note;
    
    //用戶信息
    private User user;
    
    //訂單明細
    private List<Orderdetail> orderdetils;

    //get和set方法省略
}

其中Orderdetail爲
mybatis

package cn.edu.hpu.mybatis.PO;

public class Orderdetail {
    
    private int id;
    
    private int orders_id;
    
    private int items_id;
    
    private int items_num;

    //get和set方法省略
}
映射成的orders記錄數爲兩條(orders信息不重複)

每一個orders中的orderDetails屬性存儲了該訂單所對應的訂單明細。

5.mapper.xml
app

<pre name="code" class="html"><!-- 查詢訂單關聯查詢用戶信息以及訂單明細,使用resultMap -->
     
     <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">
         SELECT 
          orders.*,
          USER.username,
          USER.sex,
          USER.address,
          orderdetail.id orderdetail_id,
          orderdetail.items_id,
          orderdetail.items_num,
          orderdetail.orders_id
        FROM
          orders,
          USER,
          orderdetail
        WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
     </select>

6.resultMap定義學習

<!-- 訂單及訂單明細的resultMap
         使用extend繼承,不用在此中配置訂單信息和用戶信息的映射 -->
    <resultMap type="cn.edu.hpu.mybatis.PO.Orders" id="OrdersAndOrderDetailResultMap" 
               extends="OrdersUserResultMap">
        
        <!-- 使用extend繼承,不用在此中配置訂單信息和用戶信息的映射 -->
    
        <!-- 訂單明細信息
        一個訂單關聯查詢出了多個明細,要使用
        collection進行映射
        collection:對關聯查詢到多條記錄映射cn.edu.hpu.mybatis.PO.Orders哪一個屬性
        ofType:指定要映射到的集合屬性中pojo的類型(就是一個List<Orderdetail>的尖括號中的類型)
        -->
        <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"/>
        </collection>
        
</resultMap>
7.mapper.java
package cn.edu.hpu.mybatis.mapper;

import java.util.List;

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


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


    //查詢訂單(關聯查詢用戶)及訂單明細使用resultMap
    public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;
}
8.測試:
@Test
public void testFindOrdersAndOrderDetailResultMap() throws Exception{
    
    SqlSession sqlSession=sqlSessionFactory.openSession();
    //建立代理對象
    OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class);
    
    //調用mapper的方法
    List<Orders> list=ordersMapperCustom.findOrdersAndOrderDetailResultMap();
    
    for (int i = 0; i < list.size(); i++) {
        Orders  o=list.get(i);
        User u=o.getUser();
        System.out.println("\n下單用戶:");
        System.out.println(u.getUsername()+"|"+u.getSex()+"|"+u.getAddress());
        System.out.println("訂單明細:");
        List<Orderdetail> os=o.getOrderdetils();
        if(os!=null){
            for (int j = 0; j < os.size(); j++) {
                Orderdetail od=os.get(j);
                System.out.println("訂單id:"+od.getOrders_id()+
                        "商品id:"+od.getItems_id()+"訂單總數:"+od.getItems_num());
            }
        }
    }
    sqlSession.close();
}


測試結果:

下單用戶:
張三|男|河南焦做
訂單明細:
訂單id:1商品id:1訂單總數:2

下單用戶:
張三|男|河南焦做
訂單明細:
訂單id:2商品id:2訂單總數:2

下單用戶:
劉莉莉|女|山東威海
訂單明細:
訂單id:3商品id:3訂單總數:1

日誌輸出:
測試

DEBUG [main] - Opening JDBC Connection  
DEBUG [main] - Created connection 18135083.  
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@114b82b]  
DEBUG [main] - ==>  Preparing: SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id   
DEBUG [main] - ==> Parameters:   
DEBUG [main] - <==      Total: 3

測試成功!

9.小結
mybatis使用resultMap的collection對關聯查詢的多條記錄映射到一個list集合屬性中。
使用resultType實現:代理

將訂單明細映射到orders中的orderdetails中,須要本身處理,使用雙重循環遍歷,去掉重複記錄,將訂單明細放在orderdetails中。日誌

相關文章
相關標籤/搜索