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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/158459.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开发知识学习——Kotlin基础

函数声明 声明函数要用用 fun 关键字&#xff0c;就像声明类要用 class 关键字一样 「函数参数」的「参数类型」是在「参数名」的右边 函数的「返回值」在「函数参数」右边使用 : 分隔&#xff0c;没有返回值时可以省略 声明没有返回值的函数&#xff1a; fun main(){println…

虚拟机保护工具:Zerto Virtual Replication 10.0 U1 Crack

Zerto虚拟复制是为需要保护虚拟机和应用程序的企业设计的产品。通过通过连接到广域网或云到远程站点的复制来保护虚拟机。Zerto VR 2.0还可以与vCloud Director一起将虚拟机或虚拟机组复制到云端&#xff08;或从云端&#xff09;。 事实上&#xff0c;Zerto与33家云提供商合作…

某国产中间件企业:提升研发安全能力,助力数字化建设安全发展

​某国产中间件企业是我国中间件领导者&#xff0c;国内领先的大安全及行业信息化解决方案提供商&#xff0c;为各个行业领域近万家企业客户提供先进的中间件、信息安全及行业数字化产品、解决方案及服务支撑&#xff0c;致力于构建安全科学的数字世界&#xff0c;帮助客户实现…

智慧财务的未来

信息化时代&#xff0c;财务管理不再局限于传统的手工操作&#xff0c;而是借助RPA技术实现了自动化、智能化的转型。智慧财务作为财务管理的一种新模式&#xff0c;将为企业提供更加高效、便捷的服务&#xff0c;使企业能够更好地适应市场需求的变化&#xff0c;在瞬息万变的市…

基于Python的豆瓣电影排行榜,可视化系统

1 简介 基于Python flask 的豆瓣电影数据获取&#xff0c;数据可视化系统&#xff0c;本系统朱亚奥包括了影视系统的爬虫与分析。影视是人们娱乐、放松心情的重要方式之一&#xff0c;因此对影视的分析具有重要的现实意义。通过采用Python编程语言&#xff0c;使用flask框架搭…

【Linux】常见指令以及具体其使用场景

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;随着博主的学习&#xff0c;博主掌握的技能也越来越多&#xff0c;今天又根据最近的学习开设一个新的专栏——Linux&#xff0c;相信Linux操作系…

探索 Java 8 中的 Stream 流:构建流的多种方式

人嘛&#xff0c;要懂得避嫌… 开篇引入 Java 8引入了Stream流作为一项新的特性&#xff0c;它是用来处理集合数据的一种函数式编程方式。Stream流提供了一种更简洁、高效和易于理解的方法来操作集合数据&#xff0c;同时也能够实现并行处理&#xff0c;以提高性能。 以下是St…

vue3+vite实现一个后台管理框架,毒蘑菇后台管理。

写后台管理的项目写了很多个了&#xff0c;虽说用的别人的模板&#xff0c;自己专注于自己的业务&#xff0c;保证自己的业务不出错就行了&#xff0c;但是自定义配置又不好去配置&#xff0c;大家用的模板都差不多&#xff0c;用模板自带的业务功能呢后台又得是模板自带的&…

Okta 数据泄露暴露了员工的个人信息

Okta 警告近 5000 名员工&#xff0c;他们的个人信息在第三方供应商遭到破坏后泄露。 Okta 是一家位于旧金山的云身份和访问管理解决方案提供商&#xff0c;其单点登录 (SSO)、多重身份验证 (MFA) 和 API 访问管理服务被全球数千个组织使用。 该 数据泄露通知 警告称&#xf…

win10 + vs2017 + gdal2.0.3 编译

1. 下载并解压gdal2.0.3 我的放置目录是&#xff1a;D:\Depend_3rd_party\gdal2\gdal-2.0.3&#xff0c;其中gdal-2.0.3是解压得到的文件夹 2. 修改 nmake.opt 文件 用notepad打开nmake.opt文件&#xff0c;修改以下三个部分&#xff1a; &#xff08;1&#xff09;修改C co…

beego模板解析报错

文章目录 前言解决beego解析问题总结 前言 网上搜索为模板解析路径问题&#xff0c;实际是beego解析vue打包后的index.html出现错误&#xff0c; 比如解决时排除了.go代码&#xff0c;发现没问题&#xff0c;运行beego打印,打开浏览器进入web时发现wen打不开&#xff0c;并在b…

免费的PPT模版--九五小庞

PPT模板&#xff1a; www.1ppt.com/moban/    行业PPT模板&#xff1a;www.1ppt.com/hangye/ 节日PPT模板&#xff1a;www.1ppt.com/jieri/    PPT素材&#xff1a; www.1ppt.com/sucai/PPT背景图片&#xff1a;www.1ppt.com/beijing/   PPT图表&#xff…