MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存

文章目录

  • 在 handle 包下新建Jsonb处理类
    • 方式一
    • 方式二
  • PostgreSQL jsonb类型示例
    • 新建数据库表含有jsonb类型
    • 创建实体类
    • 创建Control
  • 发起请求


在 handle 包下新建Jsonb处理类

方式一

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** @author CSDN @一碗情深* @description PostgreSql jsonb 数据处理器**/
@MappedTypes({Object.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class JsonbTypeHandler extends AbstractJsonTypeHandler<Object> {private static final PGobject jsonObject = new PGobject();private final Class<?> type;public JsonbTypeHandler(Class<?> type) {this.type = type;}/*** 重写设置参数* @param ps* @param i* @param parameter* @param jdbcType* @throws SQLException*/@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {if (ps != null) {jsonObject.setType("jsonb");jsonObject.setValue(JSON.toJSONString(parameter));ps.setObject(i, jsonObject);}}/*** 根据列名,获取可以为空的结果* @param rs* @param columnName* @return* @throws SQLException*/@Overridepublic Object getNullableResult(ResultSet rs, String columnName) throws SQLException {Object v = rs.getObject(columnName);return toFill(v);}/*** 根据列索引,获取可以为空的结果* @param rs* @param columnIndex* @return* @throws SQLException*/@Overridepublic Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {Object v = rs.getObject(columnIndex);return toFill(v);}@Overridepublic Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {Object v = cs.getObject(columnIndex);return toFill(v);}@Overrideprotected Object parse(String json) {return JSON.parseObject(json, this.type);}/*** 必须将 v 转成 PGObject 处理* @param v* @return*/private Object toFill(Object v) {if (v != null && v instanceof PGobject) {PGobject p = (PGobject) v;String pv = p.getValue();if (StringUtils.isNotEmpty(pv) && ("jsonb".equals(p.getType()) || "json".equals(p.getType()))) {return parse(p.getValue());}}return v;}@Overrideprotected String toJson(Object obj) {return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty);}
}

方式二

package com.hlta.map.utils;import com.alibaba.fastjson.JSON;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** @author CSDN @一碗情深* @description PostgreSql jsonb 数据处理器**/
@MappedTypes({Object.class})
public class JsonbTypeHandler extends BaseTypeHandler<Object> {private static final PGobject jsonObject = new PGobject();@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {if (preparedStatement != null) {jsonObject.setType("jsonb");jsonObject.setValue(JSON.toJSONString(o));preparedStatement.setObject(i, jsonObject);}}@Overridepublic Object getNullableResult(ResultSet resultSet, String s) throws SQLException {return JSON.parse(resultSet.getString(s));}@Overridepublic Object getNullableResult(ResultSet resultSet, int i) throws SQLException {return JSON.parse(resultSet.getString(i));}@Overridepublic Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {return JSON.parse(callableStatement.getString(i));}
}

PostgreSQL jsonb类型示例

新建数据库表含有jsonb类型

新建数据库表含有jsonb字段

创建实体类

  • 在实体类上加上 @TableName(value = "表名", autoResultMap = true)
  • 在jsonb属性上加上 @TableField(value = "字段", typeHandler = JsonbTypeHandler.class)
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.szydtx.handle.JsonbTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;import java.io.Serializable;
import java.util.Date;/*** @author CSDN @一碗情深*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "app_control_manage", autoResultMap = true)
public class AppControlManage implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "id", type = IdType.AUTO)private Integer id;/*** 名称*/@TableField("name")private String name;/*** 关联渠道*/@TableField("channel")private String channel;/*** 控制项*/@TableField(value = "content", typeHandler = JsonbTypeHandler.class)private Object content;/*** 说明*/@TableField("description")private String description;/*** 创建日期*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@TableField(fill = FieldFill.INSERT)private Date createTime;
}

创建Control

以下方法用于接收post请求,将数据保存到数据库

@PostMapping("/test")
public Object uploadFile(@RequestBody JSONObject object, final HttpServletResponse response, final HttpServletRequest request) {AppControlManage appControlManage = object.toJavaObject(AppControlManage.class);boolean save = appControlManageService.save(appControlManage);if (save) {System.out.println("保存成功");} else {System.out.println("保存失败");}return appControlManage;
}

发起请求

post请求

可以看到,json数据被保存进数据库

数据库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/3098.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python 随练】按键变色

题目&#xff1a; Press any key to change color, do you want to try it. Please hurry up! 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个编程问题&#xff1a;按下任意键改变颜色。我们将提供一个完整的代码示例来实现这个功能&#xff0c;并鼓励读者尝试。…

【JavaScript】文档注释详解

文章目录 什么是文档注释为什么要写文档注释不使用文档注释存在的隐患使用函数成员时的书写问题调用函数时功能使用问题 文档注释官方标签函数参数标签 param参数类型 {}参数注释对象属性属性注释使用带有对象属性注释的参数 返回值标签 returns注释 作者标签 author许可证标签…

利用阿里云物联网平台(IoT)实现WEB数据可视化

一年前在阿里物联网平台测试过一个项目&#xff0c;后来就搁置了&#xff0c;昨天有事需要用&#xff0c;发现出错了。 调整完后写一下使用思路&#xff0c;以便未来之需。 阿里云物联网&#xff08;IoT&#xff09;主页&#xff1a;https://iot.aliyun.com/ 阿里云物联网&…

Linux操作系统配置代理服务器

PS:本文只是针对Linux操作系统对于代理服务器的配置操作&#xff0c;不涉及广告 1.代理的概念 代理服务器英文全称是Proxy Server&#xff0c;其功能就是代理网络用户去取得网络信息。形象的说&#xff1a;它是网络信息的中转站。在一般情况下&#xff0c;我们使用网络浏览器直…

【物联网无线通信技术】802.11无线安全认证

本文由简入繁介绍了IEEE802.11i无线局域网安全技术的前世今生&#xff0c;帮助路由器开发者对WLAN的加密安全策略有一个概念上的认知&#xff0c;能够更好地分析STA掉线以及漫游等问题。 目录 WEP WPA WPA/WPA2-PSK认证过程 802.11i WEP WEP是Wired Equivalent Privacy的简…

LabVIEW 图像处理功能

设置成像系统并采集图像后&#xff0c;您可以分析和处理图像&#xff0c;以提取有关被检测对象的有价值信息。 内容 图像分析图像处理斑点分析机器视觉 图像分析 影像分析结合了基于影像像素的灰度强度计算统计数据和测量的技术。您可以使用影像分析功能来确定影像质量是否足以…

浅谈小程序开发 [2018年]

一、问题背景 随着App市场趋近于饱和&#xff0c;大部分用户已经养成了使用习惯&#xff0c;加上开发和推广新的App的成本高&#xff0c;使得开发新的App很难在市场上生存。在此背景下&#xff0c;小程序应运而生&#xff0c;2016年&#xff0c;张小龙的微信团队首次推出了微信…

7.1下周黄金非农数据是否会影响美联储七月暂停加息?

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(6月30日)&#xff0c;现货黄金价格收盘上涨&#xff0c;盘中一度升破1920美元关口。美国疲软的个人消费支出推动了美国国债收益率的下降&#xff0c;从而导致美…

[问题解决] ubuntu 18.04 GPU驱动安装

删除当前显卡驱动[参考] sudo apt-get purge nvidia* 查看推荐驱动 sudo ubuntu-drivers devices 安装对应驱动 sudo apt install nvidia-driver-530 验证安装是否成功&#xff1a;nvidia-smi

微软Surface Book 2终止更新日前推迟,将与Surface Pro 6同日结束服务

近日有消息称&#xff0c;微软公布了旗下Surface系列设备的更新支持终止日期&#xff0c;并且包括新发布的设备和前代产品。 早在本月23日&#xff0c;微软就为Surface Book 2推送了新的固件&#xff0c;主要提升了Surface Dock 2的稳定性&#xff0c;及其他一些安全更新。  …

Django项目之mysql数据库连接和表的创建

数据库连接 首先&#xff0c;确保我们已经生成了一个基本的Django项目文件&#xff0c;目录结构如下&#xff1a; 具体搭建流程参考链接&#xff1a;https://blog.csdn.net/David_house/article/details/131188889?spm1001.2014.3001.5502找到项目下的settings文件&#xff…

基于Tars高并发IM系统的设计与实现-基础篇

基于Tars高并发IM系统的设计与实现–基础篇 作者简介 兰怀玉 毕业于中央民族大学计算机专业 先后供职国内外多家公司软件研发设计岗位&#xff0c;有丰富的软件研发经验。 从事IM领域设计研发十余年&#xff0c;先后领衔多个IM通讯系统设计与研发发&#xff0c;拥有丰富的IM系…