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 参…...
百考通:一站式计算机与工程类项目学习与精准开发平台
在信息技术高速发展的今天,无论是高校学生、编程爱好者还是行业从业者,都面临着项目实践资源分散、学习路径不清晰、开发效率低下的困境。百考通(https://www.baikaotongai.com) 应运而生,以一站式项目资源聚合平台的姿…...
FPGA开发流程全解析:从Verilog代码到硬件实现的7个关键步骤
FPGA开发实战指南:从代码到硬件的全流程精要 在电子设计自动化领域,FPGA开发因其灵活性和高性能优势,正成为越来越多工程师的首选方案。不同于传统ASIC开发的漫长周期和高昂成本,FPGA允许设计者在硬件层面进行快速迭代和验证&…...
成本控制艺术:OpenClaw+Phi-3-vision-128k-instruct任务级计费方案
成本控制艺术:OpenClawPhi-3-vision-128k-instruct任务级计费方案 1. 当Token消耗成为拦路虎 上个月收到账单时,我的手指在鼠标滚轮上停滞了整整三秒——Phi-3-vision-128k-instruct的API调用费用比预期高出47%。这个数字让我意识到,在享受…...
极空间玩出花!用 File Browser 搭建专属私有云,文件管理超丝滑
前言 玩 NAS 的朋友应该都懂,极空间的硬件确实够稳,但原生的文件管理功能总差那么点意思 —— 权限管控不精细、跨设备操作不够顺手,想把它打造成真正的私人网盘总差点火候。 直到我试了 File Browser,这款轻量又强大的开源 Web…...
Open UI5 源代码解析之780:Label.js
源代码仓库: https://github.com/SAP/openui5 源代码位置:src\sap.m\src\sap\m\Label.js sap.m.Label 文件深度解析与项目作用说明 一、文件定位与整体职责 Label.js 位于 sap.m 组件库中,是一个非常基础却影响面极广的控件实现文件。它定义了 sap.m.Label 的完整行为,…...
利用快马ai快速原型开发openclaw类网页数据抓取chrome插件
利用AI快速原型开发OpenClaw类网页数据抓取Chrome插件 最近在做一个数据采集的小项目,需要从电商网站抓取商品信息。传统做法要手动写各种XPath和CSS选择器,费时费力。后来发现用InsCode(快马)平台的AI辅助开发,可以快速实现一个类似OpenCla…...
保姆级教程:在CentOS 8 Stream上从零部署Zabbix 6.4监控系统(Nginx+MariaDB 10.6+PHP 7.4)
企业级监控系统实战:CentOS 8 Stream上部署Zabbix 6.4全栈指南 在数字化转型浪潮中,IT基础设施监控已成为企业运维的核心支柱。Zabbix作为开源监控领域的标杆产品,其6.4版本带来了更强大的自动发现机制和可视化功能。本文将手把手带您完成从裸…...
Vue表单生成器深度解析:3个维度重塑你的表单开发体验
Vue表单生成器深度解析:3个维度重塑你的表单开发体验 【免费下载链接】vue-form-generator :clipboard: A schema-based form generator component for Vue.js 项目地址: https://gitcode.com/gh_mirrors/vu/vue-form-generator 在当今快速迭代的前端开发中&…...
蛋白质功能预测:从序列同源性到多模态深度学习
点击 “AladdinEdu,你的AI学习实践工作坊”,注册即送-H卡级别算力,沉浸式云原生集成开发环境,80G大显存多卡并行,按量弹性计费,教育用户更享超低价。 摘要:蛋白质功能预测是注释未知蛋白质、揭示…...
飞浆PaddleOCR实战:5分钟实现图片转文字+表格识别(Python代码可直接套用)
飞桨PaddleOCR极速入门:零基础实现高精度图片转文字与表格解析 在数字化办公和智能信息处理的大背景下,光学字符识别(OCR)技术正成为提升工作效率的利器。想象一下,当面对堆积如山的纸质文档、会议白板照片或是复杂的财…...
