MyBatisPlus使用自定义JsonTypeHandler实现自动转化JSON

个人主页金鳞踏雨

个人简介 :大家好,我是金鳞,一个初出茅庐的Java小白

目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作

我的博客:这里是CSDN,是我学习技术,总结知识的地方。希望和各位大佬交流,共同进步 ~

背景

在项目中使用了Mybatis-Plus框架,调用了Mapper层的 insert() ,如下所示,DingRobotMsg对象 的属性包含了其它的对象(Text、Content),数据库表字段里有与之对应的字段,类型为json

java 复制代码
@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: 类型错误!
        }
    }
}
java 复制代码
@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 工具类

java 复制代码
/**
 * 对象字段转存为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对象的字段上面加上下面的注解即可!

java 复制代码
@TableField(typeHandler = JsonTypeHandler.class)
private Content content;

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

文章到这里就结束了,如果有什么疑问的地方,可以在评论区指出~

希望能和大佬们一起努力,诸君顶峰相见

再次感谢各位小伙伴儿们的支持!!!

相关推荐
notfound4043几秒前
解决SpringCloudGateway用户请求超时导致日志未记录情况
java·spring boot·spring·gateway·springcloud
Adellle3 分钟前
Java 异步回调
java·开发语言·多线程
SamDeepThinking7 分钟前
如何理解 Spring 当中的 Bean?
java·后端·面试
敖正炀13 分钟前
阻塞队列-0-3-最佳实践
java
kevinzeng14 分钟前
Java Stream 流式编程 10天系统学习计划
java
摇滚侠16 分钟前
Java 零基础全套视频教程,面向对象(进阶),笔记 90-103
java·开发语言·笔记
椰羊~王小美17 分钟前
C、Java、Go、Python 对比
java·c语言
Gerardisite18 分钟前
企业微信自动化开发新思路: RPA 接入方案
java·python·自动化·企业微信·rpa
小谢小哥19 分钟前
49-缓存一致性详解
java·后端·架构
青槿吖19 分钟前
Sentinel 进阶实战:Feign 整合 + 全局异常 + Nacos 持久化,生产环境直接用
java·开发语言·spring cloud·微服务·云原生·ribbon·sentinel