当前位置: 首页 > news >正文

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

个人主页:金鳞踏雨

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

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

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

背景

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

@Service
public class DingRobotMsgServiceImpl extends ServiceImpl<DingRobotMsgMapper, DingRobotMsg> implements IDingRobotMsgService {@Autowiredprivate DingRobotMsgMapper dingRobotMsgMapper;@Overridepublic 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;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {// 将对象转换为JSON字符串并设置到PreparedStatement中ps.setString(i, JSON.toJSONString(parameter));}@Overridepublic T getNullableResult(ResultSet rs, String columnName) throws SQLException {// 从ResultSet中获取JSON字符串并转换为指定类型的对象String jsonString = rs.getString(columnName);return JSON.parseObject(jsonString, type);}@Overridepublic T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {// 从ResultSet中获取JSON字符串并转换为指定类型的对象String jsonString = rs.getString(columnIndex);return JSON.parseObject(jsonString, type);}@Overridepublic 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;

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

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

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

http://www.lryc.cn/news/171278.html

相关文章:

  • LeetCode 2097. 合法重新排列数对【欧拉通路,DFS】2650
  • 学习笔记-接口测试(postman、jmeter)
  • 如何高效批量查询快递单号,提高工作效率?
  • 12万汉语源流词典汉字记性ACCESS\EXCEL数据库
  • 深度解剖数据在队列的应用
  • IMX6ULL移植篇-Linux内核源码目录分析二
  • 汽车行业数据治理方案,助力车企研产供销数据一体化
  • canvas-绘图库fabric.js简介
  • 代码审计——任意文件下载详解(二)
  • 19异常的学习笔记
  • Jenkins学习笔记4
  • 自学 Java 需要具备哪些基本条件或技能?
  • [激光原理与应用-68]:如何消除50Hz工频干扰和差分信号应对工频干扰
  • 【力扣-每日一题】LCP 06. 拿硬币
  • 【JAVA-Day32】精通Java函数:定义、调用和主函数的完整指南
  • springboot相关操作学习汇总
  • 如何在微信上制作自己的小程序卖东西
  • 24.Xaml ListView控件-----显示数据
  • YoloV5改进实战:使用MPDIoU改进YoloV5
  • 从电大搜题到上海开放大学,广播电视大学引领学习新风尚
  • DC/DC开关电源学习笔记(九)Buck降压拓扑原理
  • 【浏览器】主流浏览器伪元素一览
  • 国内首个潮玩行业沉浸式IP主题乐园,泡泡玛特城市乐园即将开园
  • 编译工具:CMake(八) | cmake 常用指令
  • 什么是GPT磁盘?介绍GPT(GUID 分区表)磁盘及其优势!
  • 直播视频处理过程
  • CGI与FastCGI的区别在哪里,FastCGI的应用场景讲解
  • 记录selenium和chrome使用socks代理打开网页以及查看selenium的版本
  • 2023 年最新 Docker 容器技术基础详细教程(更新中)
  • 初学phar反序列化