引言:
- mybatis-plus集合对象字段json如何自动进行相互的转换?
- 怎样在使用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;
}
}
那么字段上的处理器就换成自己定义的类型解析器,即可文章来源:https://www.toymoban.com/news/detail-412256.html
@TableField(typeHandler = MyFieldTypeHandler.class)
private List<A> aList;
总结
以上就是mybatis-plus集合对象字段json自动相互转换的内容,本文仅仅简单介绍了@TableField注解配合typeHandler的使用,其他用途下次在进行总结。文章来源地址https://www.toymoban.com/news/detail-412256.html
到了这里,关于【mybatis-plus实体类复杂对象字段json自动相互转换,以及自定义字段类型解析器】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!