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

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即可。

相关文章:

  • 【CF】Day80——Codeforces Round 872 (Div. 2) C⭐D (思维 + 模拟 | 树 + 思维 + 组合数学 + 分数取模)
  • 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
  • 【valse2025】CV与ML领域重要进展
  • python打卡训练营打卡记录day50
  • 【Java工程师面试全攻略】Day7:分布式系统设计面试精要
  • 蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
  • 聊聊 Pulsar:Producer 源码解析
  • python打卡day50
  • 常见的http状态码
  • 重温经典算法——二分查找
  • Word中如何对文献应用的格式数字连起来,如:【1-3】
  • 【SQL学习笔记3】深入理解窗口函数的用法
  • Java SE - 数组
  • svg预览器
  • 嵌入式学习Day35
  • Debian系统简介
  • 今日行情明日机会——20250610
  • 【WiFi扫描相关帧】
  • WHAT - 组件库开发场景 - 完全无样式的 UI 组件库 Headless UI
  • 从0到1:HBase安装与操作指南
  • 网站设计制作的特点有哪些/营销策略有哪些理论
  • 新疆人防建设网站/最新疫情消息
  • 网站建设新闻/广州seo搜索
  • 移动网站适配/盘多多搜索引擎入口
  • 温州做外贸网站/加强服务保障 满足群众急需需求
  • 建设网站需申请什么资料/百度基木鱼建站