深入探索MySQL中JSON数据的查询、转换及springboot中的应用

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: MySQL版本引入了对JSON数据类型的支持,这为我们处理和存储非结构化数据提供了新的可能性。通过灵活利用MySQL的JSON函数,我们可以实现高效的查询和转换操作,提取有用的数据,并将其转换为有意义的格式。本文将深入探索MySQL中JSON数据的查询与转换技巧,帮助您更好地利用这一功能。

mysql-json.jpg
MySQL版本引入了对JSON数据类型的支持,这为我们处理和存储非结构化数据提供了新的可能性。通过灵活利用MySQL的JSON函数,我们可以实现高效的查询和转换操作,提取有用的数据,并将其转换为有意义的格式。本文将深入探索MySQL中JSON数据的查询与转换技巧,帮助您更好地利用这一功能。

使用

  1. 创建包含JSON字段的表 在MySQL中,我们可以使用JSON数据类型来定义表的字段。例如,我们可以创建一个名为jsontest的表,其中包含一个名为details的JSON字段,用于存储工单的信息。下面是创建这样一张表的示例SQL语句:
    ```sql
    CREATE TABLE jsontest (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    details JSON
    );

2. 插入JSON数据 一旦我们创建了包含JSON字段的表,就可以插入JSON格式的数据。例如,我们可以插入多条工单的详细信息:

```sql
INSERT INTO `jsontest`(`details`) VALUES ('{\"title\": \"xj-test1\", \"picUrl\": \"http://192.168.10.105:8080/group1/M00/12/7A/wKgKaWRjXhWALn38AAJ5ggV2TcU357.png\", \"jumpUrl\": \"\", \"jumpFlag\": 2}');
INSERT INTO `jsontest`(`details`) VALUES ('{\"title\": \"xj-test2\", \"picUrl\": \"http://192.168.10.105:8080/group1/M00/12/8A/wKgKZ2RjXcqACOgEAAJ5grWRHy4977.png\", \"jumpUrl\": \"http://192.168.10.105:8080/cnpc/material/homePage\", \"jumpFlag\": 1}');
INSERT INTO `jsontest`(`details`) VALUES ('{\"title\": \"xj-test3\", \"picUrl\": \"http://192.168.10.105:8080/group1/M00/12/7A/wKgKaWRjXmqAbM0IAAJ5ggV2TcU473.png\", \"jumpUrl\": \"\", \"jumpFlag\": 2}');
INSERT INTO `jsontest`(`details`) VALUES ('{\"title\": \"xj-test4\", \"picUrl\": \"http://192.168.10.105:8080/group1/M00/12/8A/wKgKZ2RjXh-AJeXRAAJ5grWRHy4787.png\", \"jumpUrl\": \"http://192.168.10.105:8080/cnpc/material/homePage\", \"jumpFlag\": 1}');
INSERT INTO `jsontest`(`details`) VALUES ('{\"title\": \"xj-test5\", \"picUrl\": \"http://192.168.10.105:8080/group1/M00/12/7A/wKgKaWRjXrSAVUHaAAJ5ggV2TcU051.png\", \"jumpUrl\": \"\", \"jumpFlag\": 2}');
INSERT INTO `jsontest`(`details`) VALUES ('{\"title\": \"xj-test6\", \"picUrl\": \"http://192.168.10.105:8080/group1/M00/12/8A/wKgKZ2RjY6aAFoTRAAJ5grWRHy4558.png\", \"jumpUrl\": \"\", \"jumpFlag\": 2}');
INSERT INTO `jsontest`(`details`) VALUES ('{\"title\": \"测试创建常见问题\", \"picUrl\": \"http://192.168.10.105:8080/group1/M00/12/8A/wKgKZ2RkN0-ABLD1AAQhAGCHXXo497.png\", \"jumpUrl\": \"www.baidu.com\", \"jumpFlag\": 1}');
  1. 查询JSON数据 MySQL提供了一系列强大的函数来查询和提取JSON数据。例如,我们可以使用JSON_EXTRACT()函数提取JSON字段中的特定值。以下是一个查询工单名称和图片的示例:
    SELECT
        JSON_EXTRACT( details, '$.title' ) AS title,
        JSON_EXTRACT( details, '$.picUrl' ) AS picUrl 
    FROM
    jsontest;

或者:

SELECT
    details -> '$.title' AS title,
    details -> '$.picUrl' AS picUrl 
FROM
    jsontest

结果:
_20230701211846.png

  1. 过滤和排序JSON数据 我们可以使用WHERE子句和ORDER BY子句来过滤和排序JSON字段中的数据。例如,我们可以查询工单名称包含xj的工单,并按照名称进行降序排序:
SELECT
    JSON_EXTRACT( details, '$.title' ) AS title,
    JSON_EXTRACT( details, '$.picUrl' ) AS picUrl 
FROM
    jsontest 
WHERE
    JSON_EXTRACT( details, '$.title' ) LIKE '%xj%' 
ORDER BY
    JSON_EXTRACT( details, '$.title' ) DESC;

或者

SELECT
    details -> '$.title' AS title,
    details -> '$.picUrl' AS picUrl 
FROM
    jsontest 
WHERE
    details -> '$.title' LIKE '%xj%' 
ORDER BY
    details -> '$.title' DESC;

结果:
_20230701212800.png

  1. 更新JSON数据 MySQL提供了函数来更新JSON字段中的数据。例如,我们可以使用JSON_SET()函数工单名称:
UPDATE jsontest 
SET details = JSON_SET( details, '$.title', 'xj-update1' ) 
WHERE
    id = 1;
  1. 删除JSON数据 类似于更新操作,我们也可以使用函数来删除JSON字段中的数据。例如,我们可以使用JSON_REMOVE()函数删除工单的调换类型:
UPDATE jsontest 
SET details = JSON_REMOVE( details, '$.jumpFlag' ) 
WHERE
    id = 1;
  1. JSON数据的转换 有时候,我们需要将JSON数据转换为其他格式,例如将JSON转换为表格形式。MySQL 提供了JSON_TABLE()函数,可以将JSON数据解析为关系型表。以下是一个将JSON数据转换为表格的示例:

SELECT
    info.* 
FROM
    jsontest,
    JSON_TABLE (
        details,
    '$' COLUMNS ( title VARCHAR ( 255 ) PATH '$.title', pic_url VARCHAR ( 255 ) PATH '$.picUrl', jump_url VARCHAR ( 255 ) PATH '$.jumpUrl' ) 
    ) AS info;

结果:
_20230702061925.png

springboot 中使用

  • 添加 JSONObjectTypeHandler类
import com.alibaba.fastjson2.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JSONObjectTypeHandler extends BaseTypeHandler<JSONObject> {
   
   

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
   
   
        ps.setString(i, parameter.toJSONString());
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
   
   
        String json = rs.getString(columnName);
        return StringUtils.isNotBlank(json) ? JSONObject.parseObject(json) : null;
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
   
   
        String json = rs.getString(columnIndex);
        return StringUtils.isNotBlank(json) ? JSONObject.parseObject(json) : null;
    }

    @Override
    public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
   
   
        String json = cs.getString(columnIndex);
        return StringUtils.isNotBlank(json) ? JSONObject.parseObject(json) : null;
    }
}
  • mybatis中使用

在mybatis-config.xml添加typeHandler

<typeHandlers>
    <typeHandler handler="cn.xj.framework.json.JSONObjectTypeHandler"/>
</typeHandlers>

resultMap 中添加typeHandler

    <resultMap type="InfoVo"     id="InfoVoResult">
        <id     property="id"                     column="id"                 />
        <result property="details"           column="details"
                typeHandler="cn.xj.framework.json.JSONObjectTypeHandler"    />
    </resultMap>
  • mybatis-plus 中使用

在实体类的字段上添加注解

  /**
   * 工单内容
   */
  @TableField(value = "details",typeHandler= JSONObjectTypeHandler.class)
  private JSONObject details;

总结

MySQL的JSON支持为我们处理和查询非结构化数据提供了强大的工具。通过使用JSON函数,我们可以轻松地查询和提取JSON字段中的数据,实现灵活的过滤和排序。同时,我们还可以利用JSON函数对JSON数据进行更新和删除操作,使得数据的维护更加方便。此外,MySQL还提供了JSON_TABLE()函数,可以将JSON数据转换为关系型表格形式,进一步扩展了数据处理的能力。

通过熟练掌握MySQL中JSON数据的查询与转换技巧,您可以更好地处理和利用非结构化数据,提高应用程序的性能和灵活性。无论是构建电子商务平台还是开展数据分析,MySQL 的JSON功能都将为您带来更多可能性和创新空间。

参考文献:

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
8月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
6月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
372 0
|
8月前
|
人工智能 运维 Java
SpringBoot+MySQL实现动态定时任务
这是一个基于Spring Boot的动态定时任务Demo,利用spring-context模块实现任务调度功能。服务启动时会扫描数据库中的任务表,将任务添加到调度器中,并通过固定频率运行的ScheduleUpdater任务动态更新任务状态和Cron表达式。核心功能包括任务的新增、删除与Cron调整,支持通过ScheduledFuture对象控制任务执行。项目依赖Spring Boot 2.2.10.RELEASE,使用MySQL存储任务信息,包含任务基类ITask及具体实现(如FooTask),便于用户扩展运维界面以增强灵活性。
320 10
|
5月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
491 10
|
6月前
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
670 3
|
6月前
|
SQL 存储 缓存
MySQL 如何高效可靠处理持久化数据
本文详细解析了 MySQL 的 SQL 执行流程、crash-safe 机制及性能优化策略。内容涵盖连接器、分析器、优化器、执行器与存储引擎的工作原理,深入探讨 redolog 与 binlog 的两阶段提交机制,并分析日志策略、组提交、脏页刷盘等关键性能优化手段,帮助提升数据库稳定性与执行效率。
184 0
|
9月前
|
监控 Java 关系型数据库
Spring Boot整合MySQL主从集群同步延迟解决方案
本文针对电商系统在Spring Boot+MyBatis架构下的典型问题(如大促时订单状态延迟、库存超卖误判及用户信息更新延迟)提出解决方案。核心内容包括动态数据源路由(强制读主库)、大事务拆分优化以及延迟感知补偿机制,配合MySQL参数调优和监控集成,有效将主从延迟控制在1秒内。实际测试表明,在10万QPS场景下,订单查询延迟显著降低,超卖误判率下降98%。
429 5
|
8月前
|
存储 SQL 缓存
mysql数据引擎有哪些
MySQL 提供了多种存储引擎,每种引擎都有其独特的特点和适用场景。以下是一些常见的 MySQL 存储引擎及其特点:
228 0
|
3月前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析:
|
3月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南

推荐镜像

更多