SpringBoot_mybatis-plus使用json字段
mybatis-plus使用json字段
- 1.前言
- 2.方案分析
- 2.1 为什么是json
- 2.2 数据库的选择
- 3. 实战
- 3.1 使用text字段(h2数据库)
- 3.1.1 建表语句
- 3.1.2 数据操作与查询
- 3.2 使用json字段(mysql数据库)
- 3.2.1 建表语句
- 3.2.2 数据操作与查询
- 4. 附录
- 4.1 MySQL JSON索引用法
- 4.2 mybatis-plus json查询用法
- 5. 参考文档
1.前言
在springboot项目开发中,一般使用关系型数据库作为主库存储数据,有时候业务场景需要在既有的表结构上,扩展自定义业务信息. 这种场景下一般使用json类型存储。本文总结springboot项目中,借助mybatis-plus操作json实践方案
2.方案分析
2.1 为什么是json
JSON类型相对于传统的关系型结构,其具有数据本身对结构描述、动态扩展和嵌套等特性,能够更加自由地表示和存储数据
2.2 数据库的选择
json字段的存储依赖于底层选择的数据库, 有的关系型数据库已经支持json,比如MySQL5.7版本中,引入了JSON类型。如果没有特殊的json类型, 我们可以使用text类型存储json文本。因此要分两种情况分析. 这两种模式区别:
- 提供json类型数据库,在查询灵活程度上更高,比如可以针对json指定key的value进行查询。text之恶能作为普通文本匹配
- 提供json类型数据库,查询会部分依赖底层特殊查询语法. text则是通用的数据类型不存在该情况。
3. 实战
无论底层数据库使用text类型还是json类型。持久层使用mybatis-plus都要处理json与对象的映射问题。创建一个Account账号对象为例,增加一个extendJson作为存储扩展数据的json对象
@TableName(value = "account", autoResultMap = true)
public class Account {@TableId(type = IdType.AUTO)private Long id;private String name;private String username;/*** 注意!! 必须开启映射注解** @TableName(autoResultMap = true)* <p>* 以下两种类型处理器,二选一 也可以同时存在* <p>* 注意!!选择对应的 JSON 处理器也必须存在对应 JSON 解析依赖包*///@TableField(typeHandler = JacksonTypeHandler.class)@TableField(typeHandler = FastjsonTypeHandler.class)private JSONObject extendJson;//setter/getter忽略
以上部分主要参考mp官网:https://baomidou.com/ >>字段类型处理器
3.1 使用text字段(h2数据库)
使用text字段测试json字段我们使用h2数据库进行测试
- h2版本: 1.4.200(该版本不支持原生的json字段)
3.1.1 建表语句
使用liquibase管理建表语句
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"><changeSet author="demo" id="account.createTable"><createTable tableName="account" remarks="账号表"><!--设置id自增 起始位置从10000 每次加1--><column name="id" remarks="账户ID" type="bigint" autoIncrement="true" incrementBy="1" startWith="10000"><constraints primaryKey="true" nullable="false"/></column><!--用户名增加唯一索引--><column name="username" remarks="用户名" type="VARCHAR(32)"><constraints nullable="false" unique="true" uniqueConstraintName="uniq_username"/></column><column name="password" remarks="密码" type="VARCHAR(32)"/><column name="name" remarks="姓名" type="VARCHAR(20)"/><column name="sex" remarks="性别" type="CHAR(1)"/><column name="phone" remarks="手机" type="VARCHAR(100)"/><column name="email" remarks="邮件" type="VARCHAR(100)"/><column name="create_time" remarks="创建时间" type="datetime(0)"/><column name="update_time" remarks="修改时间" type="datetime(0)"/>
<!-- <column name="extend_json" remarks="拓展字段使用" type="json"/>--><column name="extend_json" remarks="拓展字段使用" type="text"/></createTable></changeSet><!--loadData:加载 csv 文件到已存在的表中--><changeSet author="easy-log-demo" id="account.loadData" ><loadData tableName="account" file="db/liquibase/csv/account.csv" ></loadData></changeSet></databaseChangeLog>
3.1.2 数据操作与查询
text存储json的数据操作与查询与普通text操作无差别
@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;public void createAccount(Account account) {account.setUsername(UUID.randomUUID().toString().replace("-", ""));this.accountMapper.insert(account);}public Account updateAccount(Account account) {this.accountMapper.updateById(account);return this.accountMapper.selectById(account.getId());}@Overridepublic List<Account> listAll() {return this.accountMapper.selectList(Wrappers.emptyWrapper());}}
效果:

3.2 使用json字段(mysql数据库)
3.2.1 建表语句
使用liquibase管理建表语句
- MySQL使用版本: 大于等于5.7
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"><changeSet author="demo" id="account.createTable"><createTable tableName="account" remarks="账号表"><!--设置id自增 起始位置从10000 每次加1--><column name="id" remarks="账户ID" type="bigint" autoIncrement="true" incrementBy="1" startWith="10000"><constraints primaryKey="true" nullable="false"/></column><!--用户名增加唯一索引--><column name="username" remarks="用户名" type="VARCHAR(32)"><constraints nullable="false" unique="true" uniqueConstraintName="uniq_username"/></column><column name="password" remarks="密码" type="VARCHAR(32)"/><column name="name" remarks="姓名" type="VARCHAR(20)"/><column name="sex" remarks="性别" type="CHAR(1)"/><column name="phone" remarks="手机" type="VARCHAR(100)"/><column name="email" remarks="邮件" type="VARCHAR(100)"/><column name="create_time" remarks="创建时间" type="datetime(0)"/><column name="update_time" remarks="修改时间" type="datetime(0)"/><column name="extend_json" remarks="拓展字段使用" type="json"/></createTable></changeSet><!--loadData:加载 csv 文件到已存在的表中--><changeSet author="easy-log-demo" id="account.loadData" ><loadData tableName="account" file="db/liquibase/csv/account.csv" ></loadData></changeSet></databaseChangeLog>
3.2.2 数据操作与查询
mysql支持json类型因此借助特定的语法可以实现json精确查询及模糊查询
@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;public void createAccount(Account account) {account.setUsername(UUID.randomUUID().toString().replace("-", ""));this.accountMapper.insert(account);}public Account updateAccount(Account account) {this.accountMapper.updateById(account);return this.accountMapper.selectById(account.getId());}/*** json 数据模糊查询* @param key extend_json 中的json的key* @param value extend_json 中的json的key对应value* @return*/public List<Account> listByJsonLike(String key, String value) {
// QueryChainWrapper<Account> queryWrapper = new QueryChainWrapper<>(this.accountMapper);LambdaQueryWrapper<Account> queryWrapper = Wrappers.<Account>lambdaQuery();//json字段模式查询queryWrapper.apply("JSON_EXTRACT(extend_json, '$." + key + "') LIKE {0}", "%" + value + "%").ge(Account::getId, 10000);return this.accountMapper.selectList(queryWrapper);}/*** json 数据精确查询* @param key extend_json 中的json的key* @param value extend_json 中的json的key对应value* @return*/public List<Account> listByJsonEquals(String key, String value) {LambdaQueryWrapper<Account> queryWrapper = Wrappers.<Account>lambdaQuery();//json字段精确查询queryWrapper.apply("JSON_EXTRACT(extend_json, '$." + key + "') = {0}", value);return this.accountMapper.selectList(queryWrapper);}@Overridepublic List<Account> listAll() {return this.accountMapper.selectList(Wrappers.emptyWrapper());}}
- 效果:测试json内部字段模糊查询

4. 附录
4.1 MySQL JSON索引用法
TODO MySQLJSON索引用法介绍
4.2 mybatis-plus json查询用法
public class YourService {@Autowiredprivate YourMapper yourMapper;public YourEntity getByJsonKey(String key, String value) {QueryWrapper<YourEntity> queryWrapper = Wrappers.<YourEntity>lambdaQuery().apply("json_data->'$.key' = {0}", value);return yourMapper.selectOne(queryWrapper);}
}
在上述示例中,.apply(“json_data->‘$.key’ = {0}”, value) 中的 {0} 将会被 MyBatis-Plus 自动处理为预编译参数,保证了 SQL 的安全性。
请确保你的 MyBatis-Plus 版本支持 .apply() 方法,该方法可以用于执行自定义的 SQL 查询条件。
5. 参考文档
- mybatis-plus字段类型处理器
- mybatis-plus
相关文章:
SpringBoot_mybatis-plus使用json字段
mybatis-plus使用json字段 1.前言2.方案分析2.1 为什么是json2.2 数据库的选择 3. 实战3.1 使用text字段(h2数据库)3.1.1 建表语句3.1.2 数据操作与查询 3.2 使用json字段(mysql数据库)3.2.1 建表语句3.2.2 数据操作与查询 4. 附录4.1 MySQL JSON索引用法4.2 mybatis-plus json…...
牛客出bug(华为机试HJ71)
Hj71:字符串通配符 描述 问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。 要求: 实现如下2个通配符: *:匹配0个…...
第十一章 日志管理
第十一章 日志管理 1日志进程rsyslog 任务一 rsyslog 系统日志管理 关心问题 哪些程序产生的什么日志放到什么地方 任务一详解 1处理日志的进程 第一类 rsyslog 系统专职日志程序 处理绝大部分日志记录 系统操作有关的信息 如登录信息 程序启动关闭信息 错误喜喜 …...
灯串跨境外贸出口欧美CE认证和UL588报告周期解析
灯串灯具出口欧盟要做CE认证,CE认证需要做CE的两项检测,工作电压直流75V以上,交流50V以上 测试EMCLVD两项。 灯串LVD(安规)标准为: 欧洲EN 60598-2-20:2015 1.标记 2.结构 3.爬电距离和电气间隙 4.接线端子 5.外部接线和内…...
大数据中的分布式文件系统MapReduce的选择题
一 . 选择题 一. 单选题(共9题,49.5分) (单选题)下列传统并行计算框架,说法错误的是哪一项? A. 刀片服务器、高速网、SAN,价格贵,扩展性差上 B. 共享式(共享内存/共享存储),容错性好 C. 编程难度高 D. 实时、细粒度计算、计算密集型 正确答…...
storm安装手册及笔记
图解Storm相关概念 图解storm的并发机制 安装Storm的步骤 1、安装一个zookeeper集群 2、上传storm的安装包,解压 3、修改配置文件storm.yaml #所使用的zookeeper集群主机 storm.zookeeper.servers: - "weekend05" - "weekend06"…...
vue 视频流播放
采用的技术是vueflv.js 前言 常见视频流格式 ● RTMP(推流端、拉流端) ● RTSP(推流端) ● HLS(拉流端) ● FLV(拉流端) 视频流是否依赖插件直播/点播协议web/移动端flv否直播点播…...
Azure 机器学习 - 使用Python SDK训练模型
目录 一、环境准备二、工作区限制三、什么是计算目标?四、本地计算机五、远程虚拟机六、Apache Spark 池七、Azure HDInsight八、Azure Batch九、Azure Databricks十、Azure Data Lake Analytics十一、Azure 容器实例十二、Kubernetes 了解如何用 SDK v1 将 Azure 计…...
C#成员属性代码示例
namespace Lesson_1类和对象 {class Person{private string name;private int age;private int money;private bool sex;public string Name { get{ //可以在返回之前设立一些逻辑规则。//相当于要获得一个返回值,有点像方法//意味着这个属性将要获取的内容。return…...
3、Dockerfile 深入与其他细节
Dockerfile 在 Docker 中创建镜像最常用的方式,就是使用 Dockerfile。Dockerfile 是一个 Docker 镜像 的描述文件,我们可以理解成火箭发射的 A、B、C、D…的步骤。Dockerfile 其内部包含了一 条条的指令,每一条指令构建一层,因此每…...
大数据之陌陌聊天数据分析案例
目录 目标需求 数据内容 基于Hive数仓实现需求开发 1.建库建表、加载数据 2.ETL数据清洗 3需求指标统计 目标需求 基于Hadoop和hive实现聊天数据统计分析,构建聊天数据分析报表 1.统计今日总消息量 2.统计今日每小时消息量,发送和接收用户数 3.…...
03 贝尔曼公式
贝尔曼公式 前言1、Motivating examples2、state value3、Bellman equation:Derivation4、Bellman equation:Matrix-vector form4、Bellman equation:Solve the state value5、Action value 前言 本文来自西湖大学赵世钰老师的B站视频。本节课主要介绍贝尔曼公式。 本节课概要…...
学习视频剪辑:批量添加srt字幕,让视频更生动
随着社交媒体的普及,视频制作变得越来越重要。无论是记录生活,还是分享知识,视频都是一个非常有力的工具。但是,如何让您的视频更生动、更吸引人呢?通过学习视频剪辑,您可以使您的视频更具有吸引力。而在这…...
Windows桌面便签工具推荐使用哪一款?
电脑桌面上张贴便利贴可以将近期需要完成的工作计划逐一添加到便利贴中,电脑桌面悬挂便利贴工具可以督促日常各项事务的完成。当前可悬挂在电脑桌面上的便利贴工具是比较多的,其中桌面小工具便签软件敬业签可满足各行业的办公需求。 建议大家在Windows桌…...
【微信小程序】自定义组件(二)
自定义组件 纯数据字段1、什么是纯数据字段2、使用规则 组件的生命周期1、组件全部的生命周期函数2、组件主要的生命周期函数3、lifetimes节点 组件所在页面的生命周期1、什么是组件所在页面的生命周期2、 pageLifetimes节点3、生成随机的颜色值 纯数据字段 1、什么是纯数据字…...
llinux的更目录下的文件作用和举例
Linux是一种开源的操作系统,其文件系统采用了一种层次化的结构。在Linux文件系统中,最顶层的目录被称为根目录,也就是“/”(斜杠)。在根目录下,有很多文件和目录,它们各自有着不同的作用。本文将…...
20231106_抽象类abstract
抽象类abstract 关键字 abstract运用抽象类抽象方法:修饰抽象类中的某个方法,强制子类重写该方法 归纳 关键字 abstract 对于子类必须要实现特定方法,当时父类无法明确时,可定义为抽象类及抽象方法 不合理: 动物吃东西是基础,在这里写吃的方法过于简单,信息没有实际意义; 怎…...
yolov5 obb旋转框 tensorrt部署
文章目录 1.生成engine文件2.检测图像3.代码yolov5-obb tensorRT部署代码结合王新宇和fish-kong两者的代码,可以多batch批量检测旋转框 yolov5旋转框检测: https://blog.csdn.net/qq_42754919/article/details/134145174 1.生成engine文件 首先需要将pt文件转换成wts文件,…...
http中的Content-Type类型
浏览器的Content-Type 最近在做web端下载的时候需要给前端返回一个二进制的流,需要在请求头中设置一个 writer.Header().Set("Content-Type", "application/octet-stream")那么http中的Content-Type有具体有哪些呢?他们具体的使用场…...
【C语法学习】17 - fwrite()函数
文章目录 1 函数原型2 参数3 返回值4 示例 1 函数原型 fwrite():将ptr指向的内存空间中储存的数据块写入与指定流stream相关联的二进制文件中,函数原型如下: size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream)2 参…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
