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

这篇具有很好参考价值的文章主要介绍了【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的使用,其他用途下次在进行总结。文章来源地址https://www.toymoban.com/news/detail-412256.html

到了这里,关于【mybatis-plus实体类复杂对象字段json自动相互转换,以及自定义字段类型解析器】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis-plus更新对象时将字段值更新为null

            mybatis-plus在执行更新操作,当更新字段为 空字符串 或者 null 的则不会执行更新。如果要将指定字段更新null,可以通过以下三种方式实现。 1、全局配置         可以在 application.yml 配置文件中注入配置 GlobalConfiguration 属性 update-strategy, 将 update-strategy 策略调

    2024年02月15日
    浏览(38)
  • Mybatis-Plus之四种lambda方式LambdaQueryWrapper,QueryWrapper<实体>().lambda(),LambdaQueryChainWrapper<实体>

    lambda四种表达形式 使用了lambda表达式 可以通过方法引用的方式来使用实体字段名的操作,避免直接写数据库表字段名时的错写名字; 一、LambdaQueryWrapper 二、QueryWrapper实体().lambda() 三、Wrappers.实体lambdaQuery(),Wrappers.lambdaQuery(实体.class) Wrappers.实体lambdaQuery() Wrappers.lambdaQuery(实

    2023年04月11日
    浏览(40)
  • Mybatis-plus更新字段为null

    更新时,把某些字段的值更新为null,但是目前mybatis-plus的update/updateById会忽略实体类中为null的字段,导致这些字段没有更新还是原来的值。 网上比较常用的有两种: 缺点:当在其它接口更新别的字段时,本来没有想更新这个字段,但是也会把这个字段更新为null。 缺点:需

    2024年02月06日
    浏览(50)
  • Mybatis-plus怎么更新Null字段?

    本文介绍【Mybatis-plus】updateById()方法不能更新字段为null的原因及解决办法。 在日常项目开发过程中,经常会使用Mybatis-plus的updateById()方法,快速将接收道德参数或者查询结果中原本不为null的字段更新为null,并且该字段在数据库中可为null,这个时候使用updateById()并不能实现

    2024年02月13日
    浏览(30)
  • mybatis-plus更新字段为null值

    mybatis-plus相信大家都不陌生所以不在介绍 首先我们先看一下mybatis-plus的官网上的介绍  官网推荐的有三种方式可以实现 第一种:调整全局策略, mybatis-plus默认的全局策略为NOT_NULL非空默认策略,其实就是当更新是某个字段为空,则不对该字段进行更新,这也是我们常用的策略所此种

    2024年02月14日
    浏览(39)
  • mybatis-plus 根据指定字段 批量 删除/修改

    mybatis-plus 提供了根据id批量更新和修改的方法,这个大家都不陌生 但是当表没有id的时候怎么办) 这个就不说了,就是因为不想手写SQL 所以才有这篇博客 mybatis plus 的 executeBatch 参考 mybatis plus 的updateBatchById 方法. 调用处: 接口 重写方法 实现 这种写法其实批量的效率还是比较慢的

    2024年02月13日
    浏览(24)
  • Mybatis-plus通过其他字段批量更新或新增

    根据某个或者多个非ID字段进行批量更新 示例通过名称与id两个字段更新 引用mybatis-plus根据某个指定字段批量更新数据库 通过其他字段批量更新或新增

    2024年02月12日
    浏览(33)
  • MyBatis-Plus如何将字段修改为空值

    不推荐使用原因:作用范围太广,调用MyBatis-Plus封装的update会不经意将字段改为空 不推荐使用原因:相对于方案一作用范围相对较小,但调用MyBatis-Plus封装的update也会不经意将字段改为空 推荐原因:不影响任何地方只在此处生效

    2024年02月16日
    浏览(34)
  • mybatis-plus 数据字段进行加解密入库,且加密字段支持模糊搜索

    1. 开发框架、环境 springboot+mybatis-plus+mysql5.7(oracle应该也是可以的,没有测试,但实现思路是都可以满足,懒得测oracle了,哈哈) 2. 需求介绍(背景) 需求很简单: 就是将数据存储到数据库,并且将敏感数据字段进行加密处理保存(比如:身份证,手机号,银行卡 等等)

    2024年02月09日
    浏览(36)
  • Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper

    首先根据咱们返回前端的数据列来规划好排序字段 如下: 这里的字段为返回VO的字段,要转换成数据库字段然后加入到排序中 示例,穿了 surname,cerRank 多字段,然后是倒序 false 首先创建好映射,如下代码,第一个List 为前端字段VO, 第二个List 为数据库字段。Util.handle 是将两个转换

    2024年02月14日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包