MyBatis-Plus 使用 JacksonTypeHandler 存取 JSON 字段

MyBatis-Plus 使用 JacksonTypeHandler 存取 JSON 字段

问题现象

  • 数据库字段存的是 JSON 字符串(如 ["1","2"]
  • 实体类使用 JacksonTypeHandler 作为 typeHandler
  • 查询返回 null

常见原因

  1. 数据库字段类型不对

    • 建议使用 json(MySQL 5.7+)
    • 也可以是 text/varchar,但必须存标准 JSON。
      ✅ 正确:["1","2","3"]
      ❌ 错误:1,2,3
  2. 实体类没加 autoResultMap

    @TableName(value = "dm_device_type", autoResultMap = true)
    public class DmDeviceType {
        ...
    }
    

    如果不加,TypeHandler 不会生效,结果是 null

  3. MyBatis-Plus 版本太低

    • JacksonTypeHandler 需要 3.5.2+ 版本。
    • 低版本不会自动处理 JSON,直接返回 null
  4. JSON 格式与泛型不一致

    • 字段是 List<String> → 数据库必须存 ["1","2"]
    • 如果存的是 ["1",2] 或者 [1,2],会反序列化失败。

正确写法

实体类

@TableName(value = "dm_device_type", autoResultMap = true)
public class DmDeviceType {

    @TableField(value = "alert_method", typeHandler = JacksonTypeHandler.class)
    private List<String> alertMethod;

}

数据库存储

insert into dm_device_type(id, alert_method) 
values('123', '["1","2","3"]');

查询结果

DmDeviceType deviceType = dmDeviceTypeMapper.selectById("123");
System.out.println(deviceType.getAlertMethod()); 
// 输出: [1, 2, 3]

排查步骤

  1. 确认 MyBatis-Plus 版本 ≥ 3.5.2
  2. 确认实体类加了 autoResultMap = true
  3. SQL 手动查询,确认字段是标准 JSON 格式
  4. 确认字段泛型与存储 JSON 数据类型匹配
posted @ 2025-08-25 10:18  槑孒  阅读(296)  评论(0)    收藏  举报