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

西安百度网站快速优化设备外贸用哪个网站

西安百度网站快速优化,设备外贸用哪个网站,网站开发技术实验报告,自己创业网站开发Spring boot Mybatis-plus PostgreSQL 处理json类型情况 一、前言二、技术栈三、背景分析四、方案分析4.1 在PostgreSQL 数据库中直接存储 json 对象4.2 在PostgreSQL 数据库中存储 json 字符串 五、自定义类型处理器5.1 定义类型处理器5.2 使用自定义类型处理器 一、前言 在…

Spring boot + Mybatis-plus + PostgreSQL 处理json类型情况

  • 一、前言
  • 二、技术栈
  • 三、背景分析
  • 四、方案分析
    • 4.1 在PostgreSQL 数据库中直接存储 json 对象
    • 4.2 在PostgreSQL 数据库中存储 json 字符串
  • 五、自定义类型处理器
    • 5.1 定义类型处理器
    • 5.2 使用自定义类型处理器

一、前言

在 Springboot 项目开发中,一般使用关系型数据库作为主库存储数据,有时候业务场景需要在既有的表结构上,扩展自定义业务信息。这种场景下一般使用json类型存储。本文总结 Springboot 项目中,借助 Mybatis-plus 操作json实践方案。

二、技术栈

Spring boot + Mybatis-plus + PostgreSQL,在 PostgreSQL 数据库中某一个字段为 json 类型。

在这里插入图片描述

三、背景分析

在 MyBatis 中,类型处理器(TypeHandler)扮演着 JavaType 与 JdbcType 之间转换的桥梁角色。它们用于在执行 SQL 语句时,将 Java 对象的值设置到 PreparedStatement 中,或者从 ResultSet 或 CallableStatement 中取出值。

MyBatis-Plus 给大家提供了提供了一些内置的类型处理器,可以通过 TableField 注解快速注入到 MyBatis 容器中,从而简化开发过程。MyBatis-Plus 字段类型处理器官方参考文档:字段类型处理器 | MyBatis-Plus (baomidou.com)

JSON 字段类型处理器

MyBatis-Plus 内置了多种 JSON 类型处理器,包括 AbstractJsonTypeHandler 及其子类 Fastjson2TypeHandlerFastjsonTypeHandlerGsonTypeHandlerJacksonTypeHandler 等。这些处理器可以将 JSON 字符串与 Java 对象相互转换。

四、方案分析

4.1 在PostgreSQL 数据库中直接存储 json 对象

PostgreSQL 数据库字段如上图所示:param_config 是一个 json 类型的字段。

步骤一:DO实体写法

字段数据类型为 com.alibaba.fastjson2.JSONObject

@Data
@Accessors(chain = true)
@TableName(autoResultMap = true)
public class User {private Long id;.../*** 关键代码!!!* 必须开启映射注解** @TableName(autoResultMap = true)** 选择对应的 JSON 处理器,并确保存在对应的 JSON 解析依赖包*/@TableField(value = "param_config", typeHandler = JacksonTypeHandler.class)// 或者使用 FastjsonTypeHandler// @TableField(typeHandler = FastjsonTypeHandler.class)private JSONObject paramConfig;
}

步骤二:XML 配置对应写法

<!-- 关键代码!!!!!!! -->
<!-- 单个字段的类型处理器配置 -->
<result column="param_config" jdbcType="VARCHAR" property="paramConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" /><!-- 多个字段中某个字段的类型处理器配置 -->
<resultMap id="departmentResultMap" type="com.baomidou...DepartmentVO"><result property="director" column="director" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
</resultMap>
<select id="selectPageVO" resultMap="departmentResultMap">select id,name,director from department ...
</select>

查看保存在数据库中的结果,如下图所示:

在这里插入图片描述

4.2 在PostgreSQL 数据库中存储 json 字符串

先在 PostgreSQL 的数据库 URL 后面加上 &stringtype=unspecified,注意,如果此配置前面直接是数据库名字,则需要将 & 换成 ?

步骤一:DO实体类写法

@TableField(value = "param_config", typeHandler = JacksonTypeHandler.class)
private String paramConfig;

步骤二:XML 配置对应写法

<!-- 单个字段的类型处理器配置 -->
<result column="param_config" jdbcType="VARCHAR" property="paramConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />

查看保存在数据库中的结果,如下图所示:

在这里插入图片描述

五、自定义类型处理器

在 MyBatis-Plus 中,除了使用内置的类型处理器外,开发者还可以根据需要自定义类型处理器。

例如,当使用 PostgreSQL 数据库时,可能会遇到 JSON 类型的字段,这时可以创建一个自定义的类型处理器来处理 JSON 数据。

5.1 定义类型处理器

以下是一个自定义的 JSON 类型处理器的示例:

package com.ruoyi.common.utils.pg;import com.ruoyi.common.utils.StringUtils;
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;/*** @ClassName: JsonTypeHandlerPg* @Description: json对象处理* @Author: hjm* @Date: 2024-07-11 10:34*/
@MappedTypes(String.class)
public class JsonTypeHandlerPg extends BaseTypeHandler<String> {/*** 引入PGSQL提供的工具类PGobject*/private static final PGobject JSON_OBJECT = new PGobject();public static final String JSON_TYPE = "json";/*** 关键位置!!!*/@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String param, JdbcType jdbcType) throws SQLException {JSON_OBJECT.setType(JSON_TYPE);JSON_OBJECT.setValue(param);ps.setObject(i, JSON_OBJECT);}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {String sqlJson = rs.getString(columnName);if (StringUtils.isNotBlank(sqlJson)) {return sqlJson;}return null;}// 根据列索引,获取可以为空的结果@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String sqlJson = rs.getString(columnIndex);if (StringUtils.isNotBlank(sqlJson)) {return sqlJson;}return null;}@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String sqlJson = cs.getString(columnIndex);if (StringUtils.isNotBlank(sqlJson)) {return sqlJson;}return null;}
}

5.2 使用自定义类型处理器

在实体类中,通过 TableField 注解指定自定义的类型处理器:

/*** 测试对象** @author hjm* @date 2024-07-11*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("data_test")
public class DataTest extends BaseEntity {private static final long serialVersionUID = 1L;/*** 主键*/@TableId(value = "id")private Long id;/*** 关键位置!!!*/@TableField(typeHandler = JsonTypeHandlerPg.class)private String jsonData;
}

修改mapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.dt.mapper.DataTestMapper"><resultMap type="com.ruoyi.dt.domain.DataTest" id="DataTestResult"><result property="id" column="id"/><!-- 关键位置!!! --><result property="jsonData" column="json_data" typeHandler="com.ruoyi.common.utils.pg.JsonTypeHandlerPg"/><result property="createBy" column="create_by"/><result property="createTime" column="create_time"/><result property="updateBy" column="update_by"/><result property="updateTime" column="update_time"/></resultMap></mapper>

业务代码

    /*** 新增数据*/@Overridepublic Boolean insertByAo(DataTestAo ao) {DataTest add = BeanUtil.toBean(ao, DataTest.class);// 关键位置!!!add.setJsonData(JSONUtil.toJsonStr(ao));validEntityBeforeSave(add);boolean flag = baseMapper.insert(add) > 0;if (flag) {ao.setId(add.getId());}return flag;}

本文完结!

http://www.yayakq.cn/news/280753/

相关文章:

  • 杭州网站app开发公司合肥网站排名
  • 深圳哪里网站建设好网站建设及维护费
  • 郴州网站建设设计制作php开发的培训网站建设
  • 橙域名网站建筑八大员报名官网
  • 卖书的网站怎么做网店美工实训报告总结2000字
  • 网站做多个单页链接软件开发公司简介范文大全
  • 佛山家居网站全网营销中山大兴网站建设
  • 高性能标准网站建设进阶指南 pdf网页设计素材免费版
  • 公司网站实名认证怎么让网站无法自适应
  • 浙江做铁塔的公司网站php mysql网站开发全程实例.pdf
  • 网站开发 进度表网页设计模板素材库
  • 网站设置高度工程建设服务平台
  • 信誉好的邯郸网站建设网页美工主要做什么
  • 深圳做装修网站费用多少钱江干网站建设
  • 常州个性化网站建设山东省建设工程 评估中心网站
  • python做的网站如何打开wordpress文章类插件
  • 赣州找工作的网站深圳led网站建设
  • 可以玩h5的网站有关做生态环境的官方网站
  • 中京建设集团有限公司网站在哪里可以做网站
  • 网站建设 阿里wordpress本地搬迁
  • 商家网站建设模板深圳创业补贴10万
  • 百度网站怎么申请注册创建网站超市
  • 建聊天网站网站制作西安
  • 合肥网站建设报价如何建立公司网站招标
  • 手机网站推荐哪个好wordpress怎么修改语言
  • 土巴兔装修公司电话网站的哪些标签需要优化
  • 江苏分销网站建设短网址生成工具 请输入长网址: 缩短网址
  • 网站定制开发加公众号商业空间设计案例ppt
  • 粉丝帮女流做的网站手机网站开发算什么费用
  • 微信小程序与微网站简单网站开发实例汇总