MyBatis resultMap元素的結構及使用

<resultMap> 元素表示結果映射集,是 MyBatis 中最重要也是最強大的元素,主要用來定義映射規則、級聯的更新以及定義類型轉化器等。

<resultMap> 元素的結構

<resultMap> 元素包含了一些子元素,結構如下:

<resultMap id="" type="">
    <constructor><!-- 類再實例化時用來注入結果到構造方法 -->
        <idArg/><!-- ID參數,結果爲ID -->
        <arg/><!-- 注入到構造方法的一個普通結果 -->  
    </constructor>
    <id/><!-- 用於表示哪個列是主鍵 -->
    <result/><!-- 注入到字段或JavaBean屬性的普通結果 -->
    <association property=""/><!-- 用於一對一關聯 -->
    <collection property=""/><!-- 用於一對多、多對多關聯 -->
    <discriminator javaType=""><!-- 使用結果值來決定使用哪個結果映射 -->
        <case value=""/><!-- 基於某些值的結果映射 -->
    </discriminator>
</resultMap>
<resultMap> 元素的 type 屬性表示需要的 POJO,id 屬性是 resultMap 的唯一標識。
子元素 <constructor> 用於配置構造方法(當 POJO 未定義無參數的構造方法時使用)。
子元素 <id> 用於表示哪個列是主鍵。
子元素 <result> 用於表示POJO和數據表普通列的映射關係。
子元素 <association><collection><discriminator> 用在級聯的情況下。

一條查詢 SQL 語句執行後將返回結果,而結果可以使用 Map 存儲,也可以使用 POJO 存儲。

使用 Map 存儲結果集

任何 select 語句都可以使用 Map 存儲結果,示例代碼如下:

<!-- 查詢所有用戶信息存到Map中 -->
<select id="selectAllUserMap" resultType="map">
    select * from user
</select>

測試上述 SQL 配置文件的過程如下:

首先在 com.dao.UserDao 接口中添加以下接口方法。

public List<Map<String,Object>> selectAllUserMap();

然後在 com.controller 包的 UserController 類中調用接口方法,具體代碼如下。

// 查詢所有用戶信息存到Map中
List<Map<String, Object>> lmp = userDao.selectAllUserMap();
for (Map<String, Object> map : lmp) {
    System.out.println(map);
}

上述 Map 的 key 是 select 語句查詢的字段名(必須完全一樣),而 Map 的 value 是查詢返回結果中字段對應的值,一條記錄映射到一個 Map 對象中。Map 用起來很方便,但可讀性稍差,有的開發者不太喜歡使用 Map,更多時候喜歡使用 POJO 的方式。

使用POJO存儲結果集

有的開發者喜歡使用 POJO 的方式存儲結果集,一方面可以使用自動映射,例如使用 resultType 屬性,但有時候需要更爲複雜的映射或級聯,這時候就需要使用 元素的 resultMap 屬性配置映射集合。具體步驟如下:

1)創建 POJO 類

在 myBatisDemo02 應用的 com.pojo 包中創建 POJO 類 MapUser。MapUser 類的代碼如下:

package com.pojo;
public class MapUser {
    private Integer m_uid;
    private String m_uname;
    private String m_usex;
    // 此處省略setter和getter方法
    @Override
    public String toString() {
        return "User[uid=" + m_uid + ",uname=" + m_uname + ",usex=" + m_usex
                + "]";
    }
}

2)配置 元素

在 SQL 映射文件 UserMapper.xml 中配置 元素,其屬性 type 引用 POJO 類。具體配置如下:

<!--使用自定義結果集類型-->
<resultMap type="com.pojo.MapUser" id="myResult">
    <!-- property 是 com.pojo.MapUser 類中的屬性-->
    <!-- column是查詢結果的列名,可以來自不同的表-->
    <id property="m_uid" column="uid"/>
    <result property="m_uname" column="uname"/>
    <result property="m_usex" column="usex"/>
</resultMap>

3)配置元素

在 SQL 映射文件 UserMapper.xml 中配置 元素,其屬性 resultMap 引用了 元素的 id。具體配置如下:

<!-- 使用自定義結果集類型查詢所有用戶 -->
<select id="selectResultMap" resultMap="myResult">
    select * from user
</select>

4)添加接口方法

在 com.dao.UserDao 接口中添加以下接口方法:
public List selectResultMap();

5)調用接口方法

在 com.controller 包的 UserController 類中調用接口方法,具體代碼如下:

// 使用resultMap映射結果集
List<MapUser> listResultMap = userDao.selectResultMap();
for (MapUser myUser : listResultMap) {
    System.out.println(myUser);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章