MyBatisPlus自定义JsonTypeHandler实现自动转化JSON问题

 更新时间:2023年12月07日 09:25:38   作者:金鳞踏雨  
这篇文章主要介绍了MyBatisPlus自定义JsonTypeHandler实现自动转化JSON问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

在项目中使用了Mybatis-Plus框架,调用了Mapper层的 insert() 

如下所示,DingRobotMsg对象 的属性包含了其它的对象(Text、Content)

数据库表字段里有与之对应的字段,类型为json

@Service
public class DingRobotMsgServiceImpl extends ServiceImpl<DingRobotMsgMapper, DingRobotMsg> implements IDingRobotMsgService {
 
    @Autowired
    private DingRobotMsgMapper dingRobotMsgMapper;
 
    @Override
    public void insertRobotMsg(DingRobotMsg dingRobotMsg) {
        // 新增
        dingRobotMsg.setState("1");
        if (dingRobotMsg.getMsgtype().equals("text") || dingRobotMsg.getMsgtype().equals("file")) {
            dingRobotMsgMapper.insert(dingRobotMsg);
        } else {
            // TODO: 类型错误!
        }
    }
}
@Data
@TableName("t_dingtalk_recemsg")
public class DingRobotMsg {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
 
    @TableField(value = "msgtype")
    private String msgtype;
 
    private Content content;
 
    private Text text;
 
    // ...
}

这种情况,我们如何在不增加业务逻辑(数据处理)的情况下实现数据库的插入操作呢?

JsonTypeHandler

有的对象字段需要存储为Json,可以直接转成Json赋值后再保存。

也可以通过Mybatis的TypeHandler自动处理。

通用 JsonTypeHandler 工具类

/**
 * 对象字段转存为Json类型
 * @param <T>
 */
@MappedTypes({Text.class, Content.class})
public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
 
    private final Class<T> type;
 
    public JsonTypeHandler(Class<T> type) {
        if (type == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        }
        this.type = type;
    }
 
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        // 将对象转换为JSON字符串并设置到PreparedStatement中
        ps.setString(i, JSON.toJSONString(parameter));
    }
 
    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 从ResultSet中获取JSON字符串并转换为指定类型的对象
        String jsonString = rs.getString(columnName);
        return JSON.parseObject(jsonString, type);
    }
 
    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 从ResultSet中获取JSON字符串并转换为指定类型的对象
        String jsonString = rs.getString(columnIndex);
        return JSON.parseObject(jsonString, type);
    }
 
    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 从CallableStatement中获取JSON字符串并转换为指定类型的对象
        String jsonString = cs.getString(columnIndex);
        return JSON.parseObject(jsonString, type);
    }
}

JsonTypeHandler 的使用

在entry对象的字段上面加上下面的注解即可!

@TableField(typeHandler = JsonTypeHandler.class)
private Content content;
 
@TableField(typeHandler = JsonTypeHandler.class)
private Text text;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 简单了解SpringMVC常用组件作用解析

    简单了解SpringMVC常用组件作用解析

    这篇文章主要介绍了简单了解SpringMVC常用组件作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 排查Java应用内存泄漏问题的步骤

    排查Java应用内存泄漏问题的步骤

    这篇文章主要介绍了排查Java应用内存泄漏问题的步骤,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-11-11
  • org.apache.zookeeper.KeeperException.BadVersionException异常的解决

    org.apache.zookeeper.KeeperException.BadVersionException异常的解

    在使用Apache ZooKeeper进行分布式协调时,你可能会遇到org.apache.zookeeper.KeeperException.BadVersionException异常,本文就来介绍一下解决方法,感兴趣的可以了解一下
    2024-03-03
  • 在ssm中使用ModelAndView跳转页面失效的解决

    在ssm中使用ModelAndView跳转页面失效的解决

    这篇文章主要介绍了在ssm中使用ModelAndView跳转页面失效的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • springboot application无法使用$获取pom变量的问题及解决

    springboot application无法使用$获取pom变量的问题及解决

    这篇文章主要介绍了springboot application无法使用$获取pom变量的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 关于java数组与字符串相互转换的问题

    关于java数组与字符串相互转换的问题

    这篇文章主要介绍了java数组与字符串相互转换的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • java实现学生选课系统

    java实现学生选课系统

    这篇文章主要为大家详细介绍了java实现学生选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 详解SpringBoot中自定义starter的开发与使用

    详解SpringBoot中自定义starter的开发与使用

    starter是SpringBoot中非常重要的一个机制,他是基于约定优于配置的思想所衍生出来的,本文主要介绍了SpringBoot中自定义starter的开发与使用,感兴趣的可以了解下
    2023-09-09
  • Java复习之集合框架总结

    Java复习之集合框架总结

    本篇文章主要介绍了Java复习之集合框架总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 如何通过源码了解Java的自动装箱拆箱详解

    如何通过源码了解Java的自动装箱拆箱详解

    装箱就是把基本类型转换成包装类,拆箱就是把包装类转换成基本类型,下面这篇文章主要给大家介绍了关于如何通过源码了解Java的自动装箱拆箱的相关资料,需要的朋友可以参考下
    2022-04-04

最新评论