Mybatis-plus自定义类型转换器

在使用MyBatis-Plus3.4.1时,遇到复杂类型字段需在插入/更新前转为JSON字符串,查询时再还原为对象的问题。通过创建自定义类型转换器`DataContentToString`处理`DataContent`类,实现了字段的自动转换。在实体类中使用`@TableField(typeHandler=DataContent.class)`注解并添加`autoResultMap=true`以启用自动映射,解决了查询时字段为null的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

利用[mybatis-plus 3.4.1]在做插入/更新之前将对象内复杂类型字段自动转换成json串,查询要用的时候再自动的从json转换成对象

问题描述

数据表中字段类型为longText的字段,实体类中类型也同样设置为JAVA对象,但MyBatis-Plus查询数据时为null,其余数据都可正常查询出来。

解决方案

利用@TableField 和自定义类型转换器

自定义转换器

@MappedTypes({DataContent.class})
@MappedJdbcTypes(value = JdbcType.VARCHAR)
public class DataContentToString extends AbstractJsonTypeHandler<DataContent> {

  @Override
  protected DataContent parse(String json) {
    if (Strings.isNullOrEmpty(json)) {
      return new DataContent();
    }
    try {
      return OBJECT_MAPPER.readValue(json, DataContent.class);
    } catch (JsonProcessingException e) {
      throw new RuntimeException("类型转换失败", e);
    }
  }

  @Override
  protected String toJson(DataContent obj) {
    if (obj == null) {
      return "{}";
    }
    try {
      return OBJECT_MAPPER.writeValueAsString(obj);
    } catch (JsonProcessingException e) {
      throw new RuntimeException("类型转换失败", e);
    }
  }
}

实体类

@Data
@TableName(autoResultMap = true)
public class Entity {
  private String id;
  ## 此处填写自定义转换器
  @TableField(typeHandler = DataContent.class)
  private DataJobContent process;
}

踩过的坑

1、网上的解决方法都不合适。要不就很复杂,要不就是要改ResultMap、要不就是建议selectByExampleWithBLOBs,但3.4.1不存在!!耽误很久!!

2、自定义完类型转换器后,插入能够正常插入,查询依旧为空,断点到父类发现 查询时不走类型转换器,百度出的自定义的类型转换器的写法都对,查阅官网后,发现忽略了在实体类上填加 autoResultMap = true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值