Mybatis第七篇【resultMap、resultType、延遲加載】

resultMap

有的時候,我們看別的映射文件,可能看不到以下這麼一段代碼:


    <resultMap id="userListResultMap" type="user" >
        <!-- 列名
        id_,username_,birthday_
        id:要映射結果集的唯 一標識 ,稱爲主鍵
        column:結果集的列名
        property:type指定的哪個屬性中
         -->
         <id column="id_" property="id"/>
         <!-- result就是普通列的映射配置 -->
         <result column="username_" property="username"/>
         <result column="birthday_" property="birthday"/>

    </resultMap>

因爲,如果我們的數據表的字段和JavaBean的屬性名稱是相同時,我們就不用上面那段代碼了。Mybatis會自動幫我們把返回的結果進行封裝成JavaBean

那當我們數據表的字段和JavaBean的屬性名稱不是相同時,我們就需要使用resultMap,也就是上面那段代碼

resultMap和resultType區別

resultType :指定輸出結果的類型(pojo、簡單類型、hashmap..),將sql查詢結果映射爲java對象 。

  • 使用resultType注意:sql查詢的列名要和resultType指定pojo的屬性名相同,指定相同 屬性方可映射成功,如果sql查詢的列名要和resultType指定pojo的屬性名全部不相同,list中無法創建pojo對象的。

resultMap:將sql查詢結果映射爲java對象。

  • 如果sql查詢列名和最終要映射的pojo的屬性名不一致,使用resultMap將列名和pojo的屬性名做一個對應關係 (列名和屬性名映射配置)

使用resultMap


    <resultMap id="userListResultMap" type="user" >
        <!-- 列名
        id_,username_,birthday_
        id:要映射結果集的唯 一標識 ,稱爲主鍵
        column:結果集的列名
        property:type指定的哪個屬性中
         -->
         <id column="id_" property="id"/>
         <!-- result就是普通列的映射配置 -->
         <result column="username_" property="username"/>
         <result column="birthday_" property="birthday"/>

    </resultMap>

這裏寫圖片描述

這裏寫圖片描述


resultType和resultMap用法總結

resultType:

  • 作用:

    • 將查詢結果按照sql列名pojo屬性名一致性映射到pojo中。
  • 場合:

    • 常見一些明細記錄的展示,將關聯查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)即可。

resultMap:

  • 使用association和collection完成一對一和一對多高級映射。

association:

  • 作用:
    • 將關聯查詢信息映射到一個pojo類中。
  • 場合:
    • 爲了方便獲取關聯信息可以使用association將關聯訂單映射爲pojo,比如:查詢訂單及關聯用戶信息。

collection:

  • 作用:
    • 將關聯查詢信息映射到一個list集合中。
  • 場合:
    • 爲了方便獲取關聯信息可以使用collection將關聯信息映射到list集合中,比如:查詢用戶權限範圍模塊和功能,可使用collection將模塊和功能列表映射到list中。

Collection在前面好像並沒有用過,下面就看一下它的用法:

Order與OrderDetails關係



package cn.itcast.mybatis.po;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class Orders implements Serializable {
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    //關聯用戶信息
    private User user;

    //訂單明細
    private List<Orderdetail> orderdetails;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number == null ? null : number.trim();
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note == null ? null : note.trim();
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public List<Orderdetail> getOrderdetails() {
        return orderdetails;
    }

    public void setOrderdetails(List<Orderdetail> orderdetails) {
        this.orderdetails = orderdetails;
    } 

}

SQL語句


     <!-- 一對多查詢使用reusltMap完成
    查詢訂單關聯查詢訂單明細
     -->
     <select id="findOrderAndOrderDetails" resultMap="orderAndOrderDetails" >
            SELECT 
      orders.*,
      user.username,
      user.sex ,
      orderdetail.id orderdetail_id,
      orderdetail.items_num,
      orderdetail.items_id
    FROM
      orders,
      USER,
      orderdetail
    WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id
     </select>

resultMap


    <!-- 一對多,查詢訂單及訂單明細 -->
    <resultMap type="orders" id="orderAndOrderDetails" extends="ordersUserResultMap">
        <!-- 映射訂單信息,和用戶信息,這裏使用繼承ordersUserResultMap -->

        <!-- 映射訂單明細信息 
        property:要將關聯信息映射到orders的哪個屬性中
        ofType:集合中pojo的類型
        -->
        <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
            <!-- id:關聯信息訂單明細的唯 一標識
            property:Orderdetail的屬性名
              -->
            <id column="orderdetail_id" property="id"/>
            <result column="items_num" property="itemsNum"/>
            <result column="items_id" property="itemsId"/>
        </collection>

    </resultMap>

延遲加載

在進行數據查詢時,爲了提高數據庫查詢性能,儘量使用單表查詢,因爲單表查詢比多表關聯查詢速度要快。

如果查詢單表就可以滿足需求,一開始先查詢單表,當需要關聯信息時,再關聯查詢,當需要關聯信息再查詢這個叫延遲加載

在Mybatis中延遲加載就是在resultMap中配置具體的延遲加載..

這裏寫圖片描述

在Mybatis的文件中配置全局延遲加載


    <!-- 全局配置參數 -->
    <settings>
        <!-- 延遲加載總開關 -->
        <setting name="lazyLoadingEnabled" value="true" />  
        <!-- 設置按需加載 -->
        <setting name="aggressiveLazyLoading" value="false" />
    </settings>

延遲加載測試

當需要用戶時調用 Orders類中的getUser()方法執行延遲加載 ,向數據庫發出sql。

由於是對User進行延遲加載,那麼我們只要查詢Orders相關的信息即可了


     <!-- 一對一查詢延遲加載
     開始只查詢訂單,對用戶信息進行延遲加載 
      -->
     <select id="findOrderUserListLazyLoading" resultMap="orderCustomLazyLoading">
         SELECT 
          orders.*
        FROM
          orders
     </select>

使用resultMap來配置延遲加載


    <!-- 一對一查詢延遲加載 的配置 -->
    <resultMap type="orders" id="orderCustomLazyLoading">
        <!-- 完成了訂單信息的映射配置 -->
        <!-- id:訂單關聯用戶查詢的唯 一 標識 -->
        <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" />
        <!--

        配置用戶信息的延遲加載
            select:延遲加載執行的sql所在的statement的id,如果不在同一個namespace需要加namespace
            sql:根據用戶id查詢用戶信息【column就是參數】
            column:關聯查詢的列
            property:將關聯查詢的用戶信息設置到Orders的哪個屬性 -->


        <!--當需要user數據的時候,它就會把column所指定的user_id傳遞過去給cn.itcast.mybatis.mapper.UserMapper.findUserById作爲參數來查詢數據-->
        <association property="user"
            select="cn.itcast.mybatis.mapper.UserMapper.findUserById" column="user_id"></association>

    </resultMap>

這裏寫圖片描述


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