【mybatis-plus实体类复杂对象字段json自动相互转换,以及自定义字段类型解析器】

引言:

  1. mybatis-plus集合对象字段json如何自动进行相互的转换?
  2. 怎样在使用mybatis-plus操作数据表的时候自动对实体类属性进行自动解析?


前言

我们平时在做开发的时候,会遇到一个字段保存json串的情况。一般情况下mybatis-plus在做插入/更新之前将对象手动转换成json串,查询要用的时候再手动的从json转换成对象,非常的low。有没有什么方案将这个过程进行自动转换呢?


有,通过 @TableField 这个注解实现

一、@TableField是什么?

说明:@TableField是mybatis-plus的一种字段处理器,该处理器可以解决字段类型转换的问题,但是需要
typeHandler Class<? extends TypeHandler> 类型处理器进行转换。

二、@TableField使用

代码如下(示例):

	@TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> abcList;

但是JacksonTypeHandler处理类只适用于简单的对象字段属性类型,遇到更复杂的嵌套json串,就需要我们自己去定义类型处理器来处理。如下类D的属性字段aList:

@Data
public class D {

    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<A> aList;

    @Data
    public static class A {
        private Map<String, B> bList;
    }

    @Data
    public static class B {
        private E e;
    }

    @Data
    public static class E {
        private String str;
    }
}

三、自定义复杂对象的处理

1. 先看下JacksonTypeHandler是怎么处理简单json对象的:

@MappedTypes({Object.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class JacksonTypeHandler extends AbstractJsonTypeHandler<Object> {
    private static final Logger log = LoggerFactory.getLogger(JacksonTypeHandler.class);
    private static ObjectMapper OBJECT_MAPPER;
    private final Class<?> type;

    public JacksonTypeHandler(Class<?> type) {
        if (log.isTraceEnabled()) {
            log.trace("JacksonTypeHandler(" + type + ")");
        }

        Assert.notNull(type, "Type argument cannot be null", new Object[0]);
        this.type = type;
    }
	// 这里对json串进行解析
    protected Object parse(String json) {
        try {
            return getObjectMapper().readValue(json, this.type);
        } catch (IOException var3) {
            throw new RuntimeException(var3);
        }
    }
	// 这里将对象转换成了json串
    protected String toJson(Object obj) {
        try {
            return getObjectMapper().writeValueAsString(obj);
        } catch (JsonProcessingException var3) {
            throw new RuntimeException(var3);
        }
    }

    public static ObjectMapper getObjectMapper() {
        if (null == OBJECT_MAPPER) {
            OBJECT_MAPPER = new ObjectMapper();
        }

        return OBJECT_MAPPER;
    }

    public static void setObjectMapper(ObjectMapper objectMapper) {
        Assert.notNull(objectMapper, "ObjectMapper should not be null", new Object[0]);
        OBJECT_MAPPER = objectMapper;
    }
}

2. 模仿JacksonTypeHandler来进行自定义字段类型解析器:MyFieldTypeHandler


@MappedTypes({Object.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class MyFieldTypeHandler extends AbstractJsonTypeHandler<Object> {
    private static final Logger log = LoggerFactory.getLogger(com.xxx.handlers.MyFieldTypeHandler.class);
    private static ObjectMapper objectMapper = new ObjectMapper();

    public MyFieldTypeHandler(Class<?> type) {
        if (log.isTraceEnabled()) {
            log.trace("JacksonTypeHandler(" + type + ")");
        }
        Assert.notNull(type, "Type argument cannot be null", new Object[0]);
    }
	
    protected Object parse(String json) {
        try {
        	// 这里进行了json解析,同样在这里也可以进行字段查询后的处理,如对象内部的手机号字段的加密展示等
            return objectMapper.readValue(json, new TypeReference<List<A>>(){});
        } catch (IOException var3) {
            throw new RuntimeException(var3);
        }
    }

    protected String toJson(Object obj) {
        try {
            return objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException var3) {
            throw new RuntimeException(var3);
        }
    }
    public static void setObjectMapper(ObjectMapper om) {
        objectMapper = om;
    }
}

那么字段上的处理器就换成自己定义的类型解析器,即可

	@TableField(typeHandler = MyFieldTypeHandler.class)
    private List<A> aList;

总结

以上就是mybatis-plus集合对象字段json自动相互转换的内容,本文仅仅简单介绍了@TableField注解配合typeHandler的使用,其他用途下次在进行总结。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值