Mybatis—高級映射之一對一查詢(七)

上一篇文章我們講解了《Mybatis—動態sql(六)》下面我們繼續來講解高級映射,即一對一查詢,一對多查詢,多對多查詢。

【訂單商品數據模型】

我們要對Mybatis講解高級映射的內容,首先要對數據庫中的各個表進行分析。
這裏寫圖片描述

1、數據模型分析思路

(1)每張表記錄的數據內容
分模塊對每張表記錄的內容進行熟悉,相當 於你學習系統 需求(功能)的過程。
(2)每張表重要的字段設置
非空字段、外鍵字段
(3)數據庫級別表與表之間的關係
外鍵關係
(4)表與表之間的業務關係
在分析表與表之間的業務關係時一定要建立 在某個業務意義基礎上去分析。

2、數據模型分析

這裏寫圖片描述

(1)用戶表user:

記錄了購買商品的用戶信息

訂單表:orders
記錄了用戶所創建的訂單(購買商品的訂單)

訂單明細表:orderdetail:
記錄了訂單的詳細信息即購買商品的信息

商品表:items
記錄了商品信息

(2)表與表之間的業務關係:

1)在分析表與表之間的業務關係時需要建立 在某個業務意義基礎上去分析。
先分析數據級別之間有關係的表之間的業務關係:

①usre和orders:
user—->orders:一個用戶可以創建多個訂單,一對多
orders—>user:一個訂單隻由一個用戶創建,一對一

②orders和orderdetail:
orders—》orderdetail:一個訂單可以包括 多個訂單明細,因爲一個訂單可以購買多個商品,每個商品的購買信息在orderdetail記錄,一對多關係
orderdetail–> orders:一個訂單明細只能包括在一個訂單中,一對一

③orderdetail和itesm:
orderdetail—》itesms:一個訂單明細只對應一個商品信息,一對一
items–> orderdetail:一個商品可以包括在多個訂單明細 ,一對多

2)再分析數據庫級別沒有關係的表之間是否有業務關係:

orders和items:
orders和items之間可以通過orderdetail表建立關係。

【一對一查詢】

1、 需求

查詢訂單信息,關聯查詢創建訂單的用戶信息

2、resultType

①sql語句

確定查詢的主表:訂單表
確定查詢的關聯表:用戶表
關聯查詢使用內鏈接?還是外鏈接?
由於orders表中有一個外鍵(user_id),通過外鍵關聯查詢用戶表只能查詢出一條記錄,可以使用內鏈接。

SELECT 
  orders.*,
  USER.username,
  USER.sex,
  USER.address 
FROM
  orders,
  USER 
WHERE orders.user_id = user.id

②創建pojo

將上邊sql查詢的結果映射到pojo中,pojo中必須包括所有查詢列名。

原始的Orders.java不能映射全部字段,需要新創建的pojo。

創建 一個pojo繼承包括查詢字段較多的po類。

這裏寫圖片描述

③mapper.xml

    <!-- 查詢訂單關聯查詢用戶信息 -->

    <select id="findOrdersUser" resultType="cn.itcast.mybatis.po.OrdersCustom">
        SELECT
        orders.*,
        USER.username,
        USER.sex,
        USER.address
        FROM
        orders,
        USER
        WHERE orders.user_id = user.id
    </select>

④mapper.java

//查詢訂單關聯查詢用戶信息
    public List<OrdersCustom> findOrdersUser()throws Exception;

3、resultMap

①sql語句

同resultType實現的sql

②使用resultMap映射的思路

使用resultMap將查詢結果中的訂單信息映射到Orders對象中,在orders類中添加User屬性,將關聯查詢出來的用戶信息映射到orders對象中的user屬性中。

③需要Orders類中添加user屬性

public class Orders {
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    //用戶信息
    private User user;
  }

④mapper.xml

定義resultMap


<!-- 訂單查詢關聯用戶的resultMap
    將整個查詢的結果映射到cn.itcast.mybatis.po.Orders中
     -->
    <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">
        <!-- 配置映射的訂單信息 -->
        <!-- id:指定查詢列中的唯 一標識,訂單信息的中的唯 一標識,如果有多個列組成唯一標識,配置多個id
            column:訂單信息的唯 一標識 列
            property:訂單信息的唯 一標識 列所映射到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"/>

        <!-- 配置映射的關聯的用戶信息 -->
        <!-- association:用於映射關聯查詢單個對象的信息
        property:要將關聯查詢的用戶信息映射到Orders中哪個屬性
         -->
        <association property="user"  javaType="cn.itcast.mybatis.po.User">
            <!-- id:關聯查詢用戶的唯 一標識
            column:指定唯 一標識用戶信息的列
            javaType:映射到user的哪個屬性
             -->
            <id column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>

        </association>
    </resultMap>

statement定義

    <!-- 查詢訂單關聯查詢用戶信息,使用resultmap -->
    <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
        SELECT
        orders.*,
        USER.username,
        USER.sex,
        USER.address
        FROM
        orders,
        USER
        WHERE orders.user_id = user.id
    </select>

⑤mapper.java

    //查詢訂單關聯查詢用戶使用resultMap
    public List<Orders> findOrdersUserResultMap()throws Exception;

4、resultType和resultMap實現一對一查詢小結

①resultType:使用resultType實現較爲簡單,如果pojo中沒有包括查詢出來的列名,需要增加列名對應的屬性,即可完成映射。
如果沒有查詢結果的特殊要求建議使用resultType。

②resultMap:需要單獨定義resultMap,實現有點麻煩,如果對查詢結果有特殊的要求,使用resultMap可以完成將關聯查詢映射pojo的屬性中。

③resultMap可以實現延遲加載,resultType無法實現延遲加載。

好了小編今天的總結就到這裏了。。歡迎關注下面的內容《Mybatis—高級映射之一對多和多對多查詢(八)》。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章