SpringBoot中如何处理MySQL中存储的JSON数据?

news2024/11/28 12:52:04

目录

一、MySQL中如何保存JSON类型的数据

1.1 建表

1.2 保存一条带json的记录

1.3 查询

二、Springboot操作当前数据库表

2.1 方式一(推荐)

2.2 方式二


JSON(JavaScript Object Notation)是一种轻量级的数据交换格式 。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

一、MySQL中如何保存JSON类型的数据

1.1 建表

CREATE TABLE `steel` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `steel_grade` json NOT NULL COMMENT '钢种,json数组',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

1.2 保存一条带json的记录

INSERT INTO steel (steel_grade)
VALUES ('["Q235", "PWB", "P610L"]');

1.3 查询

SELECT * FROM steel;

 

 当需要检索JSON类型字段中数据的某个具体值时,可以使用“->”和“->>”符号。

SELECT steel_grade -> '$[0]'
FROM steel;

SELECT steel_grade ->> '$[0]'
FROM steel;

其中->>则是反序列化后的结果。

二、Springboot操作当前数据库表

导入依赖这里就不赘述了,然后就是Application.yaml配置文件,这些都是和原来一样的。

我们通过代码生成器,自动生成实体类、controller、service、mapper这些基本结构。

话不多说,我们直接看关键的部分。

2.1 方式一(推荐)

实体类

@Data
@TableName("steel")
@ApiModel(value = "Steel对象", description = "")
public class Steel implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty("钢种,json数组")
    @TableField("steel_grade")
    private String steelGrade;
    
}

我们可以用String类型去接收数据库的JSON类型。因为JSON就是以字符串的形式存储的嘛。 

controller

@Api(tags = "钢信息")
@RestController
@RequestMapping("/steel")
public class SteelController {
    @Resource
    private SteelService steelService;

    @ApiOperation("新增一条数据,测试保存json")
    @PostMapping("save")
    public Result<String> save(String[] steelGrade){
        steelService.saveData(steelGrade);
        return Result.success();
    }

    @ApiOperation("查询数据")
    @PostMapping("selectOne")
    public Result<Steel> selectSteelById(Integer id){
        Steel steel = steelService.selectSteelById(id);
        return Result.success(steel);
    }
}

 service

@Service
public class SteelServiceImpl extends ServiceImpl<SteelMapper, Steel> implements SteelService {

    @Transactional
    @Override
    public void saveData(String... steelGrade) {
        String jsonString = JSON.toJSONString(steelGrade);
        Steel steel = new Steel();
        steel.setSteelGrade(jsonString);
        baseMapper.insert(steel);
    }

    @Override
    public Steel selectSteelById(Integer id) {
        Steel steel = baseMapper.selectById(id);
        String steelGrade = steel.getSteelGrade();
        List<String> list = JSON.parseArray(steelGrade, String.class);
        String str = "";
        for (int i = 0; i < list.size(); i++) {
            if (i == list.size() -1){
                str += list.get(i);
            }else {
                str += list.get(i) + "、";
            }
        }
        steel.setSteelGrade(str);
        return steel;
    }

}

存数据的时候,我们要将集合转成JSON字符串,进行序列化,这样才方便后面解析。 

查询的时候,我们进行反序列化,由于存的是字符串类型的JSON数组,所有直接反序列化成数组即可。

测试保存

保存成功,数据增加了一条记录,对应的json数据格式正确。

 测试查询

 

查询成功。

值得注意的是,因为我们保存的是json格式的,那么获取的时候也一定要进行反序列化,解析成我们需要的格式即可。

2.2 方式二

使用MybatisPlus提供的字段类型处理器

具体的,实体类上按照如下设置即可。

@Data
@Accessors(chain = true)
@TableName(autoResultMap = true)
public class User {
    private Long id;

    ...


    /**
     * 注意!! 必须开启映射注解
     *
     * @TableName(autoResultMap = true)
     *
     * 以下两种类型处理器,二选一 也可以同时存在
     *
     * 注意!!选择对应的 JSON 处理器也必须存在对应 JSON 解析依赖包
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    // @TableField(typeHandler = FastjsonTypeHandler.class)
    private OtherInfo otherInfo;

}

注解对应了 XML 中写法为

<result column="other_info" jdbcType="VARCHAR" property="otherInfo" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />

ok,我们在自己的项目中试验一下。

实体类

@Data
@TableName(value = "steel",autoResultMap = true)
@ApiModel(value = "Steel对象", description = "")
public class Steel implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty("钢种,json数组")
    @TableField(value = "steel_grade",typeHandler = FastjsonTypeHandler.class)
    private List<String> steelGrade;

}

controller

controller不变

service

service层不需要我们自己再转成json,或者解析json了。通过实体类的注解参数就帮我们搞定了。

@Service
public class SteelServiceImpl extends ServiceImpl<SteelMapper, Steel> implements SteelService {

    @Transactional
    @Override
    public void saveData(String... steelGrade) {
        Steel steel = new Steel();
        steel.setSteelGrade(Arrays.asList(steelGrade));
        baseMapper.insert(steel);
    }

    @Override
    public Steel selectSteelById(Integer id) {
        Steel steel = baseMapper.selectById(id);
        List<String> steelGrade = steel.getSteelGrade();
        steel.setSteelGrade(steelGrade);
        return steel;
    }


}

测试保存

 测试查询

注意:查询出来的steelGrade集合的元素都带有双引号,说明返回的是JSON字符串格式,也意味着没有进行反序列化操作。我们还需要额外处理。

因此个人而言,我更倾向于方法一。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx安装及其常用命令(实操版)

Nginx安装及其常用命令&#xff08;实操版&#xff09; 一、安装Nginx1、准备工作2、开始进行 nginx 安装 二、Nginx常用命令三、nginx.conf配置文件1、位置2、配置文件中的内容&#xff08;包含三部分&#xff09; 四、Nginx 反向代理实例 21、实现效果2、准备工作 五、Nginx …

从萌芽到巨人: 揭秘Rod Johnson与Spring框架的故事

前言 在这个充满创意和技术追求的世界中&#xff0c;有一个名为 Spring 的框架&#xff0c;它孕育了无数创新和成功的故事。这是一个关于持续进化和超越自我的故事&#xff0c;一个激励人心的旅程&#xff0c;由一位富有远见的程序员和他的团队引领着。从最初的概念到如今的成熟…

【Vue3+TS项目】硅谷甄选day02--后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 n…

存储系统及主存储器

存储器概述 分类 存储器的分类如下&#xff1a; 主存的分类&#xff1a; 主存分为随机存储器&#xff08;RAM&#xff09;和静态存储器&#xff08;RAM&#xff09;&#xff0c;随机存储器又分为静态RAM和动态RAM 存储器的层次结构 金字塔结构 主存-辅存及主存-缓存结构 …

CentOS安装MySQL5.7/8.0

CentOS安装MySQL 0. 官方教程1. 添加MySQL Yum存储库1.1 官网下载yum存储库1.2 本地安装存储库 2. 安装MySQL数据库2.1 安装MySQL5.72.2 安装MySQL8.0 3. 开启并设置MySQL服务自启动4. 修改数据库root用户密码5. 设置root用户远程连接数据库【可选】 0. 官方教程 官网教程链接…

用xshell把本地的文件夹传入服务器中,在两个服务器之间互传文件夹

两个服务器之间互传文件 假设有两个服务器A和B&#xff0c;现在你需要把A里面的东西传入B里面。 进入B服务器&#xff0c;如你想把A服务器中/root/one/unet放在B服务器中root/ww下&#xff0c;输入以下命令 scp -r -P YYY rootXX.XX.XXX.XX:/root/one/unet root/ww其中YY是你…

深度异常检测入门

异常检测定义 Anomaly detection。异常检测是对与标准行为或模式显著不同的罕见事件、项目或可疑观察的识别。异常也被称为异常值、噪声、偏差等。 对于异常的理解&#xff1a; 异常不一定是无用的&#xff0c;部分异常对数据挖掘领域有较大的价值不同的场景下&#xff0c;异…

CHATGPT的前世今生

ChatGPT是一款基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的聊天机器人&#xff0c;它的前世今生充满着令人惊叹的故事。在这篇文章中&#xff0c;我们将深入探讨ChatGPT的诞生、发展和未来。 一、ChatGPT的起源 ChatGPT是由OpenAI团队开发的一款…

夏驰和徐策的解决数学问题思路之——数学归纳法

前言&#xff1a; 今天在复习概率论1.2.3 事件的概率及其性质中证明性质2有限可加性中运用到了数学归纳法&#xff0c;我对数学归纳法早有听闻&#xff0c;但是一直不知道怎么用这个方法&#xff0c;其实数学归纳法早在高中我们就已经接触到了在人教版教材选修2中就有这个方法…

ChatGPT 3.5 API的调用不全指南(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 最近更新时间&#xff1a;2023.5.17 最早更新时间&#xff1a;2023.5.17 关于怎么才能上ChatGPT、怎么才能获取API额度等等信息&#xff0c;建议直接见我的medium账号。 因为这不是能在内网发的内容。 本文不涉及相关网络问题。 我本来想靠问…

【云原生|Kubernetes】03-Pod详解

【云原生|Kubernetes】03-Pod详解 文章目录 【云原生|Kubernetes】03-Pod详解前言Pod解析Pod简介Pod的组成Pod中的几种容器的概念Pause容器初始化容器主容器伴随容器容器的启动顺序容器与pod与node的关系 Pod种类普通Pod静态pod静态Pod创建方式配置文件方式http方式 Job PodCro…

Debian11之 K3s 部署 K8S 集群

K3S 架构方案 Server 节点指的是运行 k3s server 命令的主机&#xff0c;control plane 和数据存储组件由 K3s 管理Agent 节点指的是运行 k3s agent 命令的主机&#xff0c;不具有任何数据存储或 control plane 组件Server 和 Agent 都运行 kubelet、容器运行时和 CNI 基于 …

ESP32C3之PlatformIO IDE开发环境

一、下载​​platformio ide扩展 在vscode里面直接搜索​​platformio ide&#xff0c;点击安装即可 二、新建esp32c3工程 2.1 首先点击小蚂蚁的图标&#xff0c;然后点击pio home 2.2 点击projects->create New Project 2.3 填写工程名和工程路径:勾选钩表示默认路径&a…

Kubernetes第1天

第一章 kubernetes介绍 本章节主要介绍应用程序在服务器上部署方式演变以及kubernetes的概念、组件和工作原理。 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物…

Redis学习---02

一、Redis基础知识 (1)redis默认有16个数据库;默认使用的是第0个数据库&#xff1b;切换数据库&#xff1a; select index 获取数据库中的值大小&#xff1a;dbsize (2)&#xff1a;查看所有的key (3):清空当前数据库&#xff1a;flushdb (4)清空所有的数据库&#xff1a;flu…

LCD1602液晶显示模块

1.认识LCD1602 1、概述&#xff1a; LCD1602&#xff08;Liquid Crystal Display&#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602&#xff0c;32个 字符(16列两行)。是我们接触引脚最多的模块。LCD1602我们的非标准协议&#xff08;标准协议有IIC、IIS、SPI&…

利用暴力攻击破解登陆密码

长久以来&#xff0c;入侵远程计算机系统的工具和技术并没有发生翻天覆地的变化。例如&#xff0c;在许多情况下&#xff0c;普通用户只要知道了相关密码&#xff0c;就能立刻变身为管理员。虽然这些情形听起来不够曲折&#xff0c;但在大多数情况下&#xff0c;暴力攻击是通过…

Kubernetes第3天

第五章 Pod详解 本章节将详细介绍Pod资源的各种配置&#xff08;yaml&#xff09;和原理。 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少 Pause容器&#xff0c;这是每个…

JavaScript实现水印效果

效果 实现思路 利用canvas绘制出文字将canvas作为遮罩层背景图, 将背景x轴和y轴重复 实现步骤 动态生成canvas并画出文字 const canvas document.createElement("canvas"); canvas.width len * fontSize; // canvas宽度, 目前是根据文字长度和大小来调整的, 自…

Postman调试依赖登录接口的3种方法

在接口测试种, 我们经常会遇到有些接口登录后才能访问.我们在使用Postman调试这种接口时一般有3种方法: 1.依次请求 如果有登录接口的文档,或者通过抓包比较容易抓出登录请求的参数和格式,可以先使用Postman请求一下登录接口,这时Cookies会存到本地(可以通过Postman Cookies管理…