当前位置: 首页 > news >正文

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文本。因此要分两种情况分析. 这两种模式区别:

  1. 提供json类型数据库,在查询灵活程度上更高,比如可以针对json指定key的value进行查询。text之恶能作为普通文本匹配
  2. 提供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. 参考文档

  1. mybatis-plus字段类型处理器
  2. 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&#xff1a;字符串通配符 描述 问题描述&#xff1a;在计算机中&#xff0c;通配符一种特殊语法&#xff0c;广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。 要求&#xff1a; 实现如下2个通配符&#xff1a; *&#xff1a;匹配0个…...

第十一章 日志管理

第十一章 日志管理 1日志进程rsyslog 任务一 rsyslog 系统日志管理 ​ 关心问题 哪些程序产生的什么日志放到什么地方 任务一详解 1处理日志的进程 第一类 rsyslog 系统专职日志程序 处理绝大部分日志记录 系统操作有关的信息 如登录信息 程序启动关闭信息 错误喜喜 …...

灯串跨境外贸出口欧美CE认证和UL588报告周期解析

灯串灯具出口欧盟要做CE认证&#xff0c;CE认证需要做CE的两项检测,工作电压直流75V以上&#xff0c;交流50V以上 测试EMCLVD两项。 灯串LVD(安规&#xff09;标准为&#xff1a; 欧洲EN 60598-2-20:2015 1.标记 2.结构 3.爬电距离和电气间隙 4.接线端子 5.外部接线和内…...

大数据中的分布式文件系统MapReduce的选择题

一 . 选择题 一. 单选题&#xff08;共9题&#xff0c;49.5分&#xff09; (单选题)下列传统并行计算框架,说法错误的是哪一项? A. 刀片服务器、高速网、SAN,价格贵,扩展性差上 B. 共享式(共享内存/共享存储),容错性好 C. 编程难度高 D. 实时、细粒度计算、计算密集型 正确答…...

storm安装手册及笔记

图解Storm相关概念 图解storm的并发机制 安装Storm的步骤 1、安装一个zookeeper集群 2、上传storm的安装包&#xff0c;解压 3、修改配置文件storm.yaml #所使用的zookeeper集群主机 storm.zookeeper.servers: - "weekend05" - "weekend06"…...

vue 视频流播放

采用的技术是vueflv.js 前言 常见视频流格式 ● RTMP&#xff08;推流端、拉流端&#xff09; ● RTSP&#xff08;推流端&#xff09; ● HLS&#xff08;拉流端&#xff09; ● FLV&#xff08;拉流端&#xff09; 视频流是否依赖插件直播/点播协议web/移动端flv否直播点播…...

Azure 机器学习 - 使用Python SDK训练模型

目录 一、环境准备二、工作区限制三、什么是计算目标&#xff1f;四、本地计算机五、远程虚拟机六、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{ //可以在返回之前设立一些逻辑规则。//相当于要获得一个返回值&#xff0c;有点像方法//意味着这个属性将要获取的内容。return…...

3、Dockerfile 深入与其他细节

Dockerfile 在 Docker 中创建镜像最常用的方式&#xff0c;就是使用 Dockerfile。Dockerfile 是一个 Docker 镜像 的描述文件&#xff0c;我们可以理解成火箭发射的 A、B、C、D…的步骤。Dockerfile 其内部包含了一 条条的指令&#xff0c;每一条指令构建一层&#xff0c;因此每…...

大数据之陌陌聊天数据分析案例

目录 目标需求 数据内容 基于Hive数仓实现需求开发 1.建库建表、加载数据 2.ETL数据清洗 3需求指标统计 目标需求 基于Hadoop和hive实现聊天数据统计分析&#xff0c;构建聊天数据分析报表 1.统计今日总消息量 2.统计今日每小时消息量&#xff0c;发送和接收用户数 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字幕,让视频更生动

随着社交媒体的普及&#xff0c;视频制作变得越来越重要。无论是记录生活&#xff0c;还是分享知识&#xff0c;视频都是一个非常有力的工具。但是&#xff0c;如何让您的视频更生动、更吸引人呢&#xff1f;通过学习视频剪辑&#xff0c;您可以使您的视频更具有吸引力。而在这…...

Windows桌面便签工具推荐使用哪一款?

电脑桌面上张贴便利贴可以将近期需要完成的工作计划逐一添加到便利贴中&#xff0c;电脑桌面悬挂便利贴工具可以督促日常各项事务的完成。当前可悬挂在电脑桌面上的便利贴工具是比较多的&#xff0c;其中桌面小工具便签软件敬业签可满足各行业的办公需求。 建议大家在Windows桌…...

【微信小程序】自定义组件(二)

自定义组件 纯数据字段1、什么是纯数据字段2、使用规则 组件的生命周期1、组件全部的生命周期函数2、组件主要的生命周期函数3、lifetimes节点 组件所在页面的生命周期1、什么是组件所在页面的生命周期2、 pageLifetimes节点3、生成随机的颜色值 纯数据字段 1、什么是纯数据字…...

llinux的更目录下的文件作用和举例

Linux是一种开源的操作系统&#xff0c;其文件系统采用了一种层次化的结构。在Linux文件系统中&#xff0c;最顶层的目录被称为根目录&#xff0c;也就是“/”&#xff08;斜杠&#xff09;。在根目录下&#xff0c;有很多文件和目录&#xff0c;它们各自有着不同的作用。本文将…...

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端下载的时候需要给前端返回一个二进制的流&#xff0c;需要在请求头中设置一个 writer.Header().Set("Content-Type", "application/octet-stream")那么http中的Content-Type有具体有哪些呢&#xff1f;他们具体的使用场…...

【C语法学习】17 - fwrite()函数

文章目录 1 函数原型2 参数3 返回值4 示例 1 函数原型 fwrite()&#xff1a;将ptr指向的内存空间中储存的数据块写入与指定流stream相关联的二进制文件中&#xff0c;函数原型如下&#xff1a; size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream)2 参…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...