1. 程式人生 > >【MyBatis】資料庫的一對多查詢:關於resultMap的使用

【MyBatis】資料庫的一對多查詢:關於resultMap的使用

利用resultMap,能夠將查詢到的複雜資料(比如查詢到幾個表中資料)對映到一個結果集當中。

(1)如下圖所示,在進行一對多查詢時:

(2)通常要求不能出現重複記錄,因此需要對結果資料可以進行整合

(3)解決方案:利用resultMap。程式碼如下:

import lombok.Data;
import java.util.List;

@Data
public class Orders {
    /**
     * 訂單ID
     */
    private Integer order_id;
    /**
     * 消費者ID
     */
    private Integer consumer_id;
    /**
     * 消費者姓名
     */
    private String consumer_name;
    /**
     * 建立時間
     */
    private String createtime;
    /**
     * 消費者資訊
     */
    private Consumer consumer;
    /**
     * 訂單詳情
     */
    private List<OrderDetail> order_detail_list;
}

orderDetailMapper.xml檔案程式碼:

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.mybatis.Dao.OrderDao">

    <!-- 配置對映資訊 -->
    <resultMap type="com.demo.mybatis.mapper.Orders" id="ordersResultMap">
        <!--
            order_id:指定查詢列中的唯一標識。注意:若唯一標識由多個列組成,則需要配置多個id
            column:對應資料庫欄位
            property: 對應Orders實體類的屬性
         -->
        <id column="order_id" property="order_id"/>
        <result column="consumer_id" property="consumer_id"/>
        <result column="consumer_name" property="consumer_name" />
        <result column="createtime" property="createtime"/>

        <!-- association:用於對映關聯查詢單個物件的資訊 -->
        <association property="consumer" javaType="com.demo.mybatis.mapper.consumer">
            <id column="consumer_id" property="consumer_id"/>
            <result column="consumer_name" property="consumer_name"/>
            <result column="age" property="age"/>
            <result column="phone_num" property="phone_num"/>
            <result column="address" property="address"/>
        </association>

        <!-- collection:對關聯查詢到多條記錄對映到集合物件中 -->
        <collection property="order_detail_list" ofType="com.demo.mybatis.mapper.Orderdetail">
            <id column="order_detail_id" property="order_detail_id"/>
            <result column="order_id" property="order_id"/>
            <result column="product_id" property="product_id"/>
            <result column="product_name" property="product_name"/>
        </collection>
    </resultMap>

    <!-- 查詢訂單關聯查詢使用者資訊,使用resultMap -->
    <select id="queryOrders" parameterType="com.demo.mybatis.mapper.OrderCriteria"
            resultMap="ordersResultMap">
        SELECT
            o.*,
            c.age,
            c.phone_num,
            c.address,
            od.order_detail_id,
            od.product_id,
            od.product_name
        FROM
	        orders o
        LEFT JOIN consumer c ON c.consumer_id = o.consumer_id
        LEFT JOIN order_detail od ON o.order_id = od.order_id
        WHERE
            o.consumer_id = 1
        OR o.consumer_id = 3
    </select>
</mapper>