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

Mybatisplus3.5.6,用String处理数据库列为JSONB字段

SQL建表语句:

CREATE TABLE ts_data (device_sn varchar(300) NOT NULL,ts TIMESTAMPTZ NOT NULL,da JSONB NOT NULL,CONSTRAINT ts_data_pkey PRIMARY KEY (device_sn, ts, da)
);

数据库表Entity,这里字段da定义为String:

@Data
@TableName("ts_data")
public class TsData {private String deviceSn;@TableField(value = "da", typeHandler = JsonbTypeHandler.class)private String da;@TableField("ts")  // 映射数据库中的TIMESTAMPTZ列private OffsetDateTime ts;}

mybatis的自定义json处理器:

import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;import java.lang.reflect.Field;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;@Slf4j
@MappedTypes({Object.class})
public class JsonbTypeHandler extends JacksonTypeHandler {public JsonbTypeHandler(Class<?> type) {super(type);}// 自3.5.6版本开始支持泛型.public JsonbTypeHandler(Class<?> type, Field field) {super(type, field);}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {if (ps != null) {PGobject jsonObject = new PGobject();jsonObject.setType("jsonb");jsonObject.setValue(toJson(parameter));ps.setObject(i, jsonObject);}}@Overridepublic Object getNullableResult(ResultSet rs, String columnName) throws SQLException {String json = rs.getString(columnName);if (json == null || json.trim().isEmpty()) {return null;}try {// 调用父类的反序列化方法return super.getNullableResult(rs, columnName);} catch (Exception e) {log.warn("反序列化JSON字段 {} 失败,原始内容: {}", columnName, json, e);// 可选:返回原始字符串而非抛出异常return json;}}}

mybatis的xml文件中配置部分,需要指定自定义处理器:

<resultMap id="ResultTsMap" type="com.demo.entity.TsData"><result column="sn" property="sn" /><result column="ts" property="ts"  /><result column="da" property="da" javaType="java.lang.String" typeHandler="com.demo.config.handler.JsonbTypeHandler" />
</resultMap>

Mapper类中的新增方法,需要指定为jsonb:

@Mapper
public interface TsDataMapper extends BaseMapper<TsData> {@Insert("insert into ts_data(device_sn,da,ts)values(#{sn},#{da}::jsonb,#{ts})")int insert(String sn, String da, OffsetDateTime ts);}

如上所示,在新增数据时,就可以将String格式的json字段插入到表中列格式为jsonb的字段。
查询时,将从数据库中查询到的字符串显示转换成json即可。

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

相关文章:

  • 配置Linux的网络为静态IP地址的一些方法
  • http协议同时传输文本和数据的新理解
  • 可编辑前端列表页面,让你的用户直接粘贴录入数据
  • pdf.js在iOS移动端分页加载优化方案(ios移动端反复刷新加载问题)
  • dedecms 织梦自定义表单留言增加ajax验证码功能
  • 传统影像的盲区:心血管疾病诊断的新突破与未来
  • H5流媒体播放器EasyPlayer.js对H.265编码MP4文件的播放支持应用方案
  • C++_核心编程_多态案例二-制作饮品
  • 【JVM】- 垃圾回收
  • 字符串方法_indexOf() +_trim()+_split()
  • 6.10 - 常用 SQL 语句以及知识点
  • 【threejs】每天一个小案例讲解:常见几何体
  • Android --- Handler的用法,子线程中怎么切线程进行更新UI
  • 清华大学视觉空间智能新突破!Spatial-MLLM:提升多模态大语言模型的视觉空间智能能力
  • 3通道图的数据在opencv的mat是如何存放的
  • flow_controllers
  • plantuml画uml图
  • Python实例题:Python计算离散数学
  • 使用swagger来生成文档
  • C++中优雅的属性封装:Sint类设计分析
  • 网络六边形受到攻击
  • PLC入门【5】基本指令3(PLS PLF ZRST)
  • TestCafe API
  • vue3 + element plus -- table表格使用sortablejs实现表格拖拽换位功能
  • 麒麟Kylin V10 SP3服务器操作系统安装
  • 项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
  • LoRA(Low-Rank Adaptation,低秩适应)
  • leetCode- 两数相加
  • 【AI学习】一、向量表征(Vector Representation)
  • 报告精读:金融算力基础设施发展报告 2024【附全文阅读】