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

news/2024/7/9 23:08:12 标签: 数据库, mybatis, postgresql

文章目录

  • 在 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
     */
    @Override
    public 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
     */
    @Override
    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Object v = rs.getObject(columnName);
        return toFill(v);
    }

    /**
     * 根据列索引,获取可以为空的结果
     * @param rs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Object v = rs.getObject(columnIndex);
        return toFill(v);
    }

    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Object v = cs.getObject(columnIndex);
        return toFill(v);
    }

    @Override
    protected 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;
    }

    @Override
    protected 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();
 
    @Override
    public 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);
        }
    }
 
    @Override
    public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
        return JSON.parse(resultSet.getString(s));
    }
 
    @Override
    public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return JSON.parse(resultSet.getString(i));
    }
 
    @Override
    public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return JSON.parse(callableStatement.getString(i));
    }
}

PostgreSQL jsonb类型示例

新建数据库表含有jsonb类型

新建<a class=数据库表含有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数据被保存进数据库

<a class=数据库" />


http://www.niftyadmin.cn/n/1005400.html

相关文章

CPU 体系结构相关的问题

连接器和加载器&#xff0c;以及编译器和汇编器&#xff0c;都需要考虑很多与体系结构配合的细节&#xff0c;包括硬件的体系结构细节&#xff0c;也包括目标代码运行环境的操作系统在体系结构方面的约定&#xff0c;本章中我们呢涉及很多计算机体系结构的知识。 硬件习题结构有…

浅谈基于分项计量的校园能源监管平台解决方案设计

张心志 关注acrelzxz 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;伴随着我国经济的飞速发展&#xff0c;国家机关办公建筑和大型公共建筑高耗能的问题日益突出&#xff0c;如何解决建筑能耗己成为一个国家总能耗的重要组成部分。学校是肩负着教育、科研和社会服…

C语言求鸡兔同笼问题案例讲解

前言&#xff1a; 作者本人在今年4月份参加了一个C语言考试&#xff0c;编程大题里有一道鸡兔同笼问题&#xff1b;本来以为简简单单&#xff0c;几分钟搞定&#xff0c;拿个满分&#xff1b;结果翻车了&#xff0c;因为我在考场的时候想着&#xff0c;母鸡到底有几只脚呢&…

git bash下修改GOROOT或GOPATH

参考 goroot和gopath - 哔哩哔哩 goroot标准库路径 gopath依赖库路径 在git bash下可以通过如下命令修改GOROOT和GOPATH go env -w GOROOT"E:/data/code/go"

springboot球赛管理小程序

球赛管理系统 springboot球赛管理系统小程序 java球赛管理小程序 技术&#xff1a; 基于springbootvue小程序球赛管理系统的设计与实现 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 数据库类型&#xff1a;MySql&#xff08;…

基于SpringBoot+vue前后端分离的相机销售系统

文章目录 项目介绍主要功能截图&#xff1a;首页相机详情个人中心 部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你…

Service 基础

今天开始来分享Service 的基础知识&#xff0c;后续我们可以慢慢打磨&#xff0c;分享 Service 的进阶知识和原理 Service 基本概念 Service 是 K8S 最核心的概念了 我们可以通过创建 Service &#xff0c;为一组具有相同功能的容器应用提供一个统一的入口地址&#xff0c;并…

【Linux | Shell命令】Linux 环境变量

目录 一、概述二、什么是环境变量2.1 全局环境变量2.2 局部环境变量 三、设置用户自定义变量3.1 设置局部用户自定义变量 四五 一、概述 Linux 系统中&#xff0c;很多程序和脚本通过环境变量来获取系统信息、存储临时数据和配置信息&#xff0c;了解去哪里设置相应的环境变量很…