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;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
- MyBatis自定义TypeHandler实现字段加密解密
- MyBatis类型处理器TypeHandler的作用及说明
- MyBatis中TypeHandler的使用教程详解
- MyBatis-Plus 中 typeHandler 的使用实例详解
- SpringBoot中MyBatis使用自定义TypeHandler的实现
- 解决Mybatis-plus自定义TypeHandler查询映射结果一直为null问题
- Mybatis中TypeHandler使用小结
- Mybatis的TypeHandler实现数据加解密详解
- Mybatis中自定义TypeHandler处理枚举的示例代码
- MyBatis自定义TypeHandler如何解决字段映射问题
- MyBatis中TypeHandler基本用法与示例
相关文章
解决MyBatis Mapper的XML文件SQL语句无法自动提示问题(亲测有效)
这篇文章主要给大家介绍了如何解决MyBatis Mapper的XML文件SQL语句无法自动提示的问题,文中有详细的原因分析,以及通过图文介绍的解决方案,需要的朋友可以参考下2023-10-10
Nacos启动出现failed to req API:/nacos/v1/ns/insta
这篇文章主要介绍了Nacos启动出现failed to req API:/nacos/v1/ns/instance after all servers问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-08-08
从内存方面解释Java中String与StringBuilder的性能差异
我们通常会发现使用StringBuffer或StringBuilder创建出来的字符串在拼接时回避String要来得快,尤其是StringBuilder,本文就从内存方面解释Java中String与StringBuilder的性能差异,需要的朋友可以参考下2016-05-05
Java数据结构及算法实例:朴素字符匹配 Brute Force
这篇文章主要介绍了Java数据结构及算法实例:朴素字符匹配 Brute Force,本文直接给出实例代码,代码中包含详细注释,需要的朋友可以参考下2015-06-06
从基础到实战详解SpringBoot3实现分页操作的完整指南
在当今的互联网软件开发领域,处理海量数据是一个绕不开的话题,这篇文章jiang深入探讨在 Spring Boot3 中如何巧妙实现分页操作,下面我们就来详细介绍一下吧2025-12-12
java多线程返回值使用示例(callable与futuretask)
这篇文章主要介绍了多线程返回值使用示例(callable与futuretask),需要的朋友可以参考下2014-04-04


最新评论