😀问题描述

  1. MyBatis-Plus 中,若想将数据库中的 JSON 字段 自动映射为 Java 对象(如 Map<String, Object> 或自定义 POJO),通常会使用内置的 JacksonTypeHandler

  2. 但仅配置typeHandler是不够的,你还需要开启一个关键开关:autoResultMap = true

  3. 否则,即使 SQL 查询成功,Java 对象中的字段仍会是 null

✅ 正确配置方式

实体类注解(必须开启 autoResultMap

@TableName(value = "chart", autoResultMap = true) // ⚠️ 关键!默认为 false
@Data
public class Chart {
    /**
     * 生成的图表数据(存储为 JSON 字符串)
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private Map<String, Object> genChart;
}

XML 映射(可选,但推荐显式声明)

如果你在 XML 中编写了自定义查询,建议也显式指定 typeHandler

<result property="genChart" column="gen_chart"
                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>

💡 底层原理简析

autoResultMap = false默认)时,MyBatis-Plus 不会为 typeHandler 字段生成 resultMap,导致 JSON 无法反序列化。

开启后,MP 会动态构建类似以下的内部映射:

<resultMap type="Chart">
  <result property="genChart" column="gen_chart" 
          typeHandler="JacksonTypeHandler"/>
</resultMap>