<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);
}