文章目錄
- 一、`resultMap` 核心作用
- 二、基本用法(以你的配置為例)
- 1. 定義 `resultMap`
- 2. 在 SQL 中使用 `resultMap`
- 三、關鍵注意事項
resultMap
是 MyBatis 中用于定義數據庫表字段與 Java 實體類屬性之間映射關系的核心配置,解決表字段名和實體類屬性名不一致、復雜類型轉換(如 JSON 轉 List)等問題。
一、resultMap
核心作用
- 字段映射:當數據庫表字段名(如
user_id
)與 Java 實體類屬性名(如userId
)不一致時,通過resultMap
明確對應關系,避免查詢結果為null
。 - 類型轉換:處理特殊類型字段(如數據庫 JSON 字符串 → Java List/對象),通過
typeHandler
指定轉換處理器(如JacksonTypeHandler
)。 - 復用性:定義一次映射規則,多個 SQL 語句可通過
resultMap="ID"
復用,減少重復配置。
二、基本用法(以你的配置為例)
1. 定義 resultMap
<!-- id:映射規則的唯一標識(自定義,如 UserCustomCategoriesMap) -->
<!-- type:對應的 Java 實體類全路徑 -->
<resultMap id="UserCustomCategoriesMap" type="com.fuka.system.domain.UserCustomCategories"><!-- 主鍵字段映射:id 標簽用于主鍵 --><id property="id" column="id"/> <!-- property:實體類屬性名;column:數據庫表字段名 --><!-- 普通字段映射:result 標簽用于非主鍵 --><result property="userId" column="user_id"/> <!-- 表字段 user_id → 實體類 userId --><!-- 特殊類型字段:通過 typeHandler 處理 JSON 轉 List<Integer> --><result property="dictId" column="dict_id" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/><!-- 時間字段映射(表字段 create_time → 實體類 createTime) --><result property="createTime" column="create_time"/><result property="updateTime" column="update_time"/>
</resultMap>
2. 在 SQL 中使用 resultMap
定義好映射規則后,在 SQL 語句中通過 resultMap
屬性引用(替代 resultType
):
<!-- 查詢用戶自定義分類,使用上面定義的映射規則 -->
<select id="getUserCustomCategories" resultMap="UserCustomCategoriesMap">SELECT id, user_id, dict_id, create_time, update_time FROM sys_user_custom_categories WHERE user_id = #{userId}
</select>
- 執行該 SQL 時,MyBatis 會按照
UserCustomCategoriesMap
的規則:- 將
user_id
字段值賦值給實體類的userId
屬性; - 用
JacksonTypeHandler
把dict_id
的 JSON 字符串轉為List<Integer>
并賦值給dictId
; - 其他字段按規則一一映射。
- 將
三、關鍵注意事項
- 字段名匹配:若表字段名與實體類屬性名完全一致(如
id
),可省略映射配置,但建議顯式寫出,清晰易懂。 resultType
** 與resultMap
區別**:resultType
:直接指定返回類型(如resultType="com.xxx.User"
),要求表字段名與實體類屬性名完全一致(或通過別名AS
匹配)。resultMap
:適用于字段名不一致、需要類型轉換的場景,靈活性更高。
- 復用性:同一實體類的多個 SQL 語句(如查詢、關聯查詢)可共用一個
resultMap
,減少重復配置。
簡單說,resultMap
就是 MyBatis 的“翻譯官”,告訴框架如何把數據庫查詢結果“翻譯”成 Java 對象,尤其在字段名不一致或有特殊類型時必須用到。