广告
返回顶部
首页 > 资讯 > 数据库 >mysql中json类型字段的基本用法实例
  • 563
分享到

mysql中json类型字段的基本用法实例

mysql的json类型mysql处理jsonmysql有解析json数据 2022-08-12 10:08:09 563人浏览 薄情痞子
摘要

目录前言基本环境JSON类型字段常用操作插入jsON类型数据查询JSON类型数据更新JSON类型数据中的特定字段匹配JSON类型数据中的特定字段结语前言 Mysql从5.7.8版本开始原生支持了JSON类型数据,同时可以

前言

Mysql从5.7.8版本开始原生支持了JSON类型数据,同时可以对JSON类型字段中的特定的值进行查询和更新等操作,通过增加JSON类型的属性可以大大的提高我们在mysql表中存储的数据的拓展性,无需每次新增字段时都进行表结构的调整,下面我们不深入讲解底层的实现原理,我们主要来梳理一下我们在日常工作中使用实践

基本环境

mysql版本:8.0.28

SpringBoot版本: 2.2.2

测试表结构:

CREATE TABLE `t_json` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `json_obj` json DEFAULT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

表结构对应的实体类:

@Data
public class JsonTest {
    private Integer id;
    private String name;
    private JsonObj jsonObj;
}

JsonObj类

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class JsonObj {
    private String data;
    private int age;
}

自定义格式转换类:转换过程通过fastjson来进行,需依赖fastjson对应的pom文件

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.iBATis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import Java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@MappedTypes(String.class)
@Slf4j
public class JsonTypeHandler<T extends Object> extends BaseTypeHandler<T> {
    private Class<T> clazz;

    public JsonTypeHandler(Class<T> clazz) {
        if (clazz == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        }
        this.clazz = clazz;
    }

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

    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return this.toObject(rs.getString(columnName), clazz);
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return this.toObject(rs.getString(columnIndex), clazz);
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return this.toObject(cs.getString(columnIndex), clazz);
    }

    private String toJson(T object) {
            return JSON.toJSONString(object);
    }

    private T toObject(String content, Class<?> clazz) {
        if (content != null && !content.isEmpty()) {
                return (T) JSON.parseobject(content, clazz);
        } else {
            return null;
        }
    }
}

JSON类型字段常用操作

插入JSON类型数据

项目开发中,表结构中的json字段可以用JSONObject这样的比较灵活的方式来传递,但是这样的方式有一个比较大的问题就是我们在获得这个结构后无法很直观的确定json字段中存储的数据,比较好的一种方式是我们将表结构中的json类型的字段以自定义的类来存储,这样我们再存取这个类对应的对象的时候,就可以明确的知道数据库中对应的json字段到底存储的是一些什么样的key,如果需要进行调整的话,我们只需要在该类中新增新的字段即可,完全无需对数据库进行任何的调整。这样的存储方式我们再插入和查询该字段的时候需要指定一个指定的数据类型转换的类来对数据库中的JSON格式数据和我们在项目中的自定义类进行转换的类,具体如下图所示:

@Mapper
public interface JsonMapper {

    @Insert({
            "insert into t_json set name= #{name}, json_obj = #{jsonObj ,jdbcType=OTHER, typeHandler=cn.example.eureka.service.one.config.JsonTypeHandler}"
    })
    int insert(JsonTest json);
}

查询JSON类型数据

在进行查询时,由于也需要进行json格式数据和自定义类的转换,所以我们需要指定对应的json字段和转换的工具类,通过@Result注解来进行指定

@Mapper
public interface JsonMapper {


    @Select({"<script>",
            "select * from t_json where id = #{id}",
    "</script>"})
    @Results(
            @Result(column = "json_obj", property = "jsonObj", typeHandler = JsonTypeHandler.class)
    )
    JsonTest getById(Integer id);

}

更新JSON类型数据中的特定字段

进行指定字段的更新的话,有两种方式可以采用,一种方式是先将该json格式字段中的所有数据都取出,然后通过修改当前对象的值,然后整个json格式字段set进去;第二种方式直接通过json格式的特定SQL语法来进行指定key的更新;下面的例子里面我们分别根据这两种不同的模式进行更新操作

//模式一:整体更新整个json字段
@Update({
            "update t_json set json_obj = #{jsonObj ,jdbcType=OTHER, typeHandler=cn.example.eureka.service.one.config.JsonTypeHandler} where id = #{id}"
    })
    int update(JsonTest jsonTest);


//模式二:只更新json字段中的特定key
@Update({
            "update t_json set json_obj = JSON_SET(json_obj, '$.data', #{data}) where id = #{id}"
    })
    int updateData(@Param("id") Integer id, @Param("data") String data);

说明

和上面的JSON_SET同样可以用于修改的操作函数还有:JSON_INSERT、 JSON_REPLACE 、 JSON_REMOVE等,下面简单说一下这几个函数的不同

  • JSON_INSERT : json字段中的key不存在才会修改
  • JSON_REPLACE : json字段中的key存在才会修改
  • JSON_SET : json字段中的可以不管是否存在都会修改
  • JSON_REMOVE : 移除json字段中的指定key

如下所示JSON_REMOVE的用法:

@Update({
            "update t_json set json_obj = JSON_REMOVE(json_obj, '$.age') where id = #{id}"
    })
    int removeAge(@Param("id") Integer id);

匹配JSON类型数据中的特定字段

//模式一
@Select({
            "select * from t_json where json_obj -> '$.age' = #{age}"
    })
    @Results(
            @Result(column = "json_obj", property = "jsonObj", typeHandler = JsonTypeHandler.class)
    )
    List<JsonTest> getByAge(int age);
    
    
//模式二
@Select({
            "select * from t_json where JSON_EXTRACT(json_obj , '$.data') = #{data}"
    })
    @Results(
            @Result(column = "json_obj", property = "jsonObj", typeHandler = JsonTypeHandler.class)
    )
    List<JsonTest> getByData(String data);

结语

到此这篇关于mysql中json类型字段的基本用法的文章就介绍到这了,更多相关mysql json类型字段用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: mysql中json类型字段的基本用法实例

本文链接: https://www.lsjlt.com/news/33667.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql中json类型字段的基本用法实例
    目录前言基本环境jsON类型字段常用操作插入JSON类型数据查询JSON类型数据更新JSON类型数据中的特定字段匹配JSON类型数据中的特定字段结语前言 mysql从5.7.8版本开始原生支持了JSON类型数据,同时可以...
    99+
    2022-08-12
    mysql的json类型 mysql处理json mysql有解析json数据
  • mysql5.7 新增的json字段类型用法实例分析
    本文实例讲述了mysql5.7 新增的json字段类型用法。分享给大家供大家参考,具体如下: 一、我们先创建一个表,准备点数据 CREATE TABLE `json_test` ( `id` int(...
    99+
    2022-10-18
  • MySQL中JSON字段数据类型怎么用
    本文小编为大家详细介绍“MySQL中JSON字段数据类型怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL中JSON字段数据类型怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言JSON 类型...
    99+
    2023-07-02
  • MySQL之JSON类型字段的使用技巧分享
    目录准备工作jsON对象基础操作JSON数组操作更多操作JSON字段在Java中的实践测试环境: mysql8.0.19 准备工作 CREATE TABLE json_demo ( `id` INT ( 11 ) N...
    99+
    2022-08-25
  • Mysql索引类型与基本用法实例分析
    本文实例讲述了Mysql索引类型与基本用法。分享给大家供大家参考,具体如下: 索引 MySQL目前主要有以下几种索引类型: 普通索引 唯一索引 主键索引 组合索引 全文索引 - 普通索引 是最...
    99+
    2022-05-17
    Mysql 索引
  • Postgresql数据库中的json类型字段使用示例详解
    目录1. json概述2. PostgreSQL数据库中使用Json类型字段2.1. 创建表定义字段信息2.2. 增加2.3. 查询键值2.3.1. 查询键2.3.2. 查询值2.3.3. where查询条件使...
    99+
    2023-02-09
    Postgresqljson类型字段使用 Postgresqljson字段
  • 使用mybatisplus接收mysql字段为json类型的数据
    一.数据库设计 CREATE TABLE `inv_learning_examination_questions` ( `id` bigint(20) NOT NULL, `title` varchar(255) CHARA...
    99+
    2023-08-31
    sql 数据库
  • Mysql修改字段名和修改字段类型的实例代码
    1、修改字段类型、字段名、字段注释、类型长度、字段默认值 mysql修改字段类型: --能修改字段类型、类型长度、默认值、注释 --对某字段进行修改 ALTER TABL...
    99+
    2022-11-13
  • 用实例解析Mysql索引类型与基本用法
    这篇文章主要用实例解析Mysql索引类型与基本用法,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。本文实例讲述了Mysql索引类型与基本用法。分享给大家供大家参...
    99+
    2022-10-18
  • Mysql json类型字段Java+Mybatis数据字典功能的实践方式
    目录前言应用场景介绍数据字典案例实践表结构实体类关系映射泛型擦除问题解决(7.21新增)效果展示总结前言 JSON类型是MySQL5.7.8中新加入的一种数据类型,并在后续版本尤其是...
    99+
    2022-11-13
  • MySQL中查询json格式的字段实例详解
    工作开发过程遇到一个需求:需要动态存储客户的姓名、手机号码、身份证、证件类型,意思是可能前端会传一个人或二个人或者三个人的信息是动态的不固定人数的四个字段(姓名、手机号码、身份证、证件类型)。 前端页面如下: 我是...
    99+
    2022-05-14
    mysql json查询 mysql json数组查询 mysql查询json内字段
  • mysql更改表中某字段数据类型的案例
    mysql更改表中某字段数据类型的案例?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!在mysql中,可以使用“ALTER ...
    99+
    2022-10-18
  • JSON字段类型在ORM中的使用是怎么样的
    JSON字段类型在ORM中的使用是怎么样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JSON字段类型在ORM中的使用  ThinkPHP5.1版本正式发布已...
    99+
    2023-06-02
  • MySQL对JSON类型字段数据进行提取和查询的实现
    目录前言1. 问题现象2. 解决方案3. JSON数据查询3.1 一般基础查询操作3.2 一般函数查询操作4. JSON数据新增更新删除前言 昨天上线后通过系统报警发现了一...
    99+
    2022-11-13
  • Mysql 中 json、JsonArray 类型字段中指定属性的模糊查询问题
    解决json类型字段的模糊查询: 存储的数据格式:{"type": "10", "mobile": "13545678900", "countryCode": "86"} select * from a where mo...
    99+
    2023-09-20
    mysql json
  • MySQL中BLOB字段类型的作用是什么
    MySQL中BLOB字段类型的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。BLOB类型的字段用于存储二进制数据MySQL中,BLO...
    99+
    2022-10-18
  • mybatis plus实体类中字段映射mysql中的json格式方式
    目录mybatis plus实体类中字段映射mysql中的json格式1.实体类中有个属性是其他对象2.那么取出时怎么进行映射呢,有分为两种情况mybatis-plus 实体 jso...
    99+
    2022-11-12
  • Python中的基本数据类型实例分析
    这篇“Python中的基本数据类型实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的基本数据类型实例分析...
    99+
    2023-07-02
  • Mysql使用函数json_extract处理Json类型数据的方法实例
    目录1. 需求概述2. json_extract简介2.1 函数简介2.2 使用方式2.3 注意事项3. 实现验证3.1 建表查询3.2 查询结果总结 1. 需求概述 业务开发中通常mysql数据库中某个字段会...
    99+
    2022-09-05
  • MySQL中JOIN连接的基本用法实例
    目录join流程详解一、笛卡尔积:CROSS JOIN二、内连接:INNER JOIN三、左连接:LEFT JOIN四、右连接:RIGHT JOIN五、全连接:O...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作