xml中resultMap 的用法,数据库 JSON 字符串 → Java List/对象

文章目录

resultMap 是 MyBatis 中用于定义数据库表字段与 Java 实体类属性之间映射关系的核心配置,解决表字段名和实体类属性名不一致、复杂类型转换(如 JSON 转 List)等问题。

一、resultMap 核心作用

  1. 字段映射 :当数据库表字段名(如 user_id)与 Java 实体类属性名(如 userId)不一致时,通过 resultMap 明确对应关系,避免查询结果为 null
  2. 类型转换 :处理特殊类型字段(如数据库 JSON 字符串 → Java List/对象),通过 typeHandler 指定转换处理器(如 JacksonTypeHandler)。
  3. 复用性 :定义一次映射规则,多个 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 属性;
    • JacksonTypeHandlerdict_id 的 JSON 字符串转为 List<Integer> 并赋值给 dictId
    • 其他字段按规则一一映射。

三、关键注意事项

  1. 字段名匹配 :若表字段名与实体类属性名完全一致(如 id),可省略映射配置,但建议显式写出,清晰易懂。
  2. resultType** 与 resultMap 区别**:
    • resultType:直接指定返回类型(如 resultType="com.xxx.User"),要求表字段名与实体类属性名完全一致(或通过别名 AS 匹配)。
    • resultMap:适用于字段名不一致、需要类型转换的场景,灵活性更高。
  3. 复用性 :同一实体类的多个 SQL 语句(如查询、关联查询)可共用一个 resultMap,减少重复配置。

简单说,resultMap 就是 MyBatis 的"翻译官",告诉框架如何把数据库查询结果"翻译"成 Java 对象,尤其在字段名不一致或有特殊类型时必须用到。