文章目录
-
-
- [一、`resultMap` 核心作用](#一、
resultMap
核心作用) - 二、基本用法(以你的配置为例)
-
- [1. 定义 `resultMap`](#1. 定义
resultMap
) - [2. 在 SQL 中使用 `resultMap`](#2. 在 SQL 中使用
resultMap
)
- [1. 定义 `resultMap`](#1. 定义
- 三、关键注意事项
- [一、`resultMap` 核心作用](#一、
-
resultMap
是 MyBatis 中用于定义数据库表字段与 Java 实体类属性之间映射关系的核心配置,解决表字段名和实体类属性名不一致、复杂类型转换(如 JSON 转 List)等问题。
一、resultMap
核心作用
- 字段映射 :当数据库表字段名(如
user_id
)与 Java 实体类属性名(如userId
)不一致时,通过resultMap
明确对应关系,避免查询结果为null
。 - 类型转换 :处理特殊类型字段(如数据库 JSON 字符串 → Java List/对象),通过
typeHandler
指定转换处理器(如JacksonTypeHandler
)。 - 复用性 :定义一次映射规则,多个 SQL 语句可通过
resultMap="ID"
复用,减少重复配置。
二、基本用法(以你的配置为例)
1. 定义 resultMap
xml
<!-- 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
):
xml
<!-- 查询用户自定义分类,使用上面定义的映射规则 -->
<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 对象,尤其在字段名不一致或有特殊类型时必须用到。