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

mybatis实现插入postgresql的json类型数据

一、前言
最近在开发需求时,需要将json类型的表字段插入数据库,而针对postgresql数据库,如果直接插入json字符串会报错,那么针对这种情况,在不使用xml语句使用函数CAST强转情况下,想要实现插入json类型的数据,那么就可以在java 字段上加入自定义json处理器,就可以实现了。

二、如何实现?

1.在定义的entity对象中,针对json类型字段添加注解实现自定义json处理器,例如:

@Data
public class SyncLog implements Serializable {@TableId(type= IdType.INPUT)private Long id;@TableField(value = "content",typeHandler = JsonTypeHandler.class)private Object content;/*** 创建时间*/private Date createTime;private static final long serialVersionUID = 1L;
}

其中content在数据库中是json类型。

2.JsonTypeHandler类实现如下:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.postgresql.util.PGobject;import java.sql.*;public class JsonTypeHandler extends BaseTypeHandler<Object> {private static final ObjectMapper objectMapper = new ObjectMapper();@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {String jsonString;try {if(parameter instanceof String){jsonString = (String) parameter;}else {jsonString = objectMapper.writeValueAsString(parameter);}} catch (JsonProcessingException e) {throw new SQLException("JsonTypeHandler JSON serialization error", e);}// 获取数据库类型Connection connection = ps.getConnection();DatabaseMetaData metaData = connection.getMetaData();String databaseProductName = metaData.getDatabaseProductName().toLowerCase();if (databaseProductName.contains("postgresql")) {PGobject pgObject = new PGobject();pgObject.setType("json"); // 或者 "jsonb" 根据需求pgObject.setValue(jsonString);ps.setObject(i, pgObject);} else {//其他数据库处理逻辑ps.setString(i, jsonString);}}@Overridepublic Object getNullableResult(ResultSet rs, String columnName) throws SQLException {return parseJson(rs.getString(columnName));}@Overridepublic Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return parseJson(rs.getString(columnIndex));}@Overridepublic Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return parseJson(cs.getString(columnIndex));}private Object parseJson(String json) throws SQLException {if (json == null) {return null;}try {return objectMapper.readTree(json);} catch (Exception e) {throw new SQLException("JsonTypeHandler JSON deserialization error", e);}}
}

3.接下来定义一个DAO。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface SyncLogDao extends BaseMapper<SyncLog> {
}

4.然后插入一条数据,如果可以插入这条json数据,表明自定义的JsonTypeHandler已生效。

@RunWith(SpringRunner.class)
@SpringBootTest(classes= AIAssetExternalApplication.class)
public class IntegrationTest {@AutowiredSyncLogDao syncLogDao;@Testpublic void sync() throws Exception {SyncLog syncLog = new SyncLog();syncLog.setId(1L);String jsonStr="{\"size\": 3474046}";syncLog.setContent(jsonStr);syncLogDao.insert(syncLog);}
}

结果插入成功,自定义的JsonTypeHandler生效。

http://www.xdnf.cn/news/875791.html

相关文章:

  • DA14531_beacon_大小信标设备开发
  • 如何安装并使用RustDesk
  • Java Fork/Join框架:三大核心组件深度解析
  • 功率估计和功率降低方法指南(1~2)
  • 2025年6月4日收获
  • 如何进行股票回测?
  • 第三方检测:软件适配测试报告
  • SAFe/LeSS/DAD等框架的核心适用场景如何选择?
  • Paraformer分角色语音识别-中文-通用 FunASR
  • SEO长尾关键词布局优化法
  • 二维码生成器
  • 宝马集团推进数字化转型:强化生产物流与财务流程,全面引入SAP现代架构
  • expect程序交互学习
  • 电子电路:共集电极放大器原理与作用解析
  • GO语言----基础类型取别名
  • PhpStorm设置中文
  • 数据库MySQL基础(3)
  • OpenAI API 流式传输
  • NX963NX970美光固态闪存NX978NX983
  • 基于单片机的FFT的频谱分析仪设计
  • Linux 系统 rsyslog 配置
  • 1.1随机试验与随机事件
  • Java 2D 图形变换方法
  • Linux 云服务器部署 Flask 项目(含后台运行与 systemd 开机自启)
  • 在java中不同数据类型的运算与内存占用分析
  • WordToCard,一键将Markdown内容转换为精美知识卡片(使用Qwen3)
  • image: ragsaas/backend:latest 背后的 来源机制 和 可能的来源地
  • Elasticsearch中的映射(Mapping)是什么?
  • 一文读懂开源AI框架REINVENT 4
  • EtherCAT AOE