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

Mybatis自动映射Java对象 与 MySQL8后的JSON数据

文章目录

  • Mybatis自动映射Java对象 与 MySQL8后的JSON数据
    • 1.转化成为正常Json类型
      • 1.1 JsonTypeHander
      • 1.2 ListJsonTypeHandler 负责List<T> 类型
      • 1.3 实体类
      • 1.4 mapper
      • 1.5 测试类
    • 2. 存储为携带类型的Json

Mybatis自动映射Java对象 与 MySQL8后的JSON数据

1.转化成为正常Json类型

自认为
优点:数据库存储为单纯的数据,不需要额外存储类型
缺点:不够通用 对于Map、Object、List<T>能用,但是对于List<List<T>>不太行需要写两个Typehander不够优雅

接下来,简单过一下流程(只有插入和查找)

1.1 JsonTypeHander

notice: 使用的转换JSON工具是hutool中的,如果自己有别的转换可以使用别的json转换工具

hutool工具包

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version></dependency>

JsonTypeHandler 这个负责非List,一般存储的都是Map,Object,和List

public class JsonTypeHandler<T> extends BaseTypeHandler<T>{private Class<T> clazz;//在Mybatis中将类型注入进来public JsonTypeHandler(Class<T> clazz) {this.clazz = clazz;}//写入数据@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, JSONUtil.toJsonStr(parameter));}/*** 一般是根据列名字获取下方就不再详述“(因为我也不知道,还没用到)* @param rs  结果* @param colName 列名*/@SneakyThrows@Overridepublic  T getNullableResult(ResultSet rs, String colName) {String data = rs.getString(colName);return StrUtil.isBlank(data) ? null : JSONUtil.toBean(data, clazz);}@SneakyThrows@Overridepublic T getNullableResult(ResultSet rs, int colIndex) {String data = rs.getString(colIndex);return StrUtil.isBlank(data) ? null : JSONUtil.toBean(data, clazz);}@SneakyThrows@Overridepublic T getNullableResult(CallableStatement cs, int i) {String data = cs.getString(i);return StrUtil.isBlank(data) ? null : JSONUtil.toBean(data, clazz);}}

1.2 ListJsonTypeHandler 负责List 类型

public class ListJsonTypeHandler<T> extends BaseTypeHandler<List<T>> implements InitializingBean {private Class<T> clazz;public ListJsonTypeHandler(Class<T> clazz) {this.clazz = clazz;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, JSONUtil.toJsonStr(parameter));}@Overridepublic List<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {String data = rs.getString(columnName);return StrUtil.isBlank(data) ? null : JSONUtil.parseArray(data).toList(clazz);}@SneakyThrows@Overridepublic List<T> getNullableResult(ResultSet rs, int colIndex) {String data = rs.getString(colIndex);return StrUtil.isBlank(data) ? null : JSONUtil.parseArray(data).toList(clazz);}@SneakyThrows@Overridepublic List<T> getNullableResult(CallableStatement cs, int i) {String data = cs.getString(i);return StrUtil.isBlank(data) ? null : JSONUtil.parseArray(data).toList(clazz);}

1.3 实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Json {/*** 唯一标识*/private Integer id;/*** map*/private Map<String,Object> mapJson;/*** 对象* 这个对象自定义的放在下面*/private Object objJson;/*** list集合* <? extends Object>这个我也不知道怎么设置  但是用这个没错*/private List<? extends Object> listJson;
}//测试的对象
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class JsonObj {/*** 唯一id*/private Integer id;/*** 测试所用*/private String str;
}

1.4 mapper

//查找 不建议用 * 代替 我是为啦偷工减料@Select(" SELECT * from json ")@Results(value = {@Result(property = "id", column = "id"),@Result(property = "mapJson", column = "mapJson", typeHandler = JsonTypeHandler.class,javaType = HashMap.class),@Result(property = "objJson", column = "objJson", typeHandler = JsonTypeHandler.class,javaType = JsonObj.class),@Result(property = "listJson", column = "listJson", typeHandler = ListJsonTypeHandler.class,javaType = JsonObj.class)})List<Json> select1();
// 增加@Insert("insert into json( mapJson, objJson, listJson) values (#{mapJson,typeHandler=com.hb.springredis.typeHandler.JsonTypeHandler}," +"#{objJson,typeHandler=com.hb.springredis.typeHandler.JsonTypeHandler}," +"#{listJson,typeHandler=com.hb.springredis.typeHandler.JsonTypeHandler})")int insert1(Json vo);

1.5 测试类

@SpringBootTest
public class ProductTest {
//这个就是刚才放sql的mapper@AutowiredJsonMapper jsonMapper;@Testvoid test11() throws JsonProcessingException {JsonObj js = JsonObj.builder().str("这真的是一个简单的测试对象").build();Map<String,Object> map =  new HashMap<>();map.put("gaga","乱杀");List<JsonObj> jsonObjs = new ArrayList<>();for (int i = 0; i < 10; i++) {JsonObj js0 = JsonObj.builder().id(i).str("这真的是一个简单的测试对象").build();jsonObjs.add(js0);}Json build = Json.builder().mapJson(map).listJson(jsonObjs).objJson(js).build();jsonMapper.insert1(build);}@Testvoid test12(){List<Json> select = jsonMapper.select1();System.out.println(select);}}

在这里插入图片描述

2. 存储为携带类型的Json

因为在java在编译的时候是泛型擦除的,所以对于,List里面的类型无法确定,于是便可以把数据类型存入数据库之中,并且不需要再指出java类型
在这里插入图片描述
实体类还和上面一样,只需调整mapper中,对应的typeHandler即可

 @Select(" SELECT * from json ")@Results(value = {@Result(property = "id", column = "id"),@Result(property = "mapJson", column = "mapJson", typeHandler = JsonTypeHandler2.class),@Result(property = "objJson", column = "objJson", typeHandler = JsonTypeHandler2.class),@Result(property = "listJson", column = "listJson", typeHandler = JsonTypeHandler2.class)})List<Json> select();@Insert("insert into json( mapJson, objJson, listJson) values (#{mapJson,typeHandler=com.hb.springredis.typeHandler.JsonTypeHandler2}," +"#{objJson,typeHandler=com.hb.springredis.typeHandler.JsonTypeHandler2}," +"#{listJson,typeHandler=com.hb.springredis.typeHandler.JsonTypeHandler2})")int insert(Json vo);

在这里插入图片描述
ListJsonTypehander2

public class ListJsonTypeHandler<T> extends BaseTypeHandler<List<T>>{private Class<T> clazz;public ListJsonTypeHandler(Class<T> clazz) {this.clazz = clazz;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, JSONUtil.toJsonStr(parameter));}@Overridepublic List<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {String data = rs.getString(columnName);return StrUtil.isBlank(data) ? null : JSONUtil.parseArray(data).toList(clazz);}@SneakyThrows@Overridepublic List<T> getNullableResult(ResultSet rs, int colIndex) {String data = rs.getString(colIndex);return StrUtil.isBlank(data) ? null : JSONUtil.parseArray(data).toList(clazz);}@SneakyThrows@Overridepublic List<T> getNullableResult(CallableStatement cs, int i) {String data = cs.getString(i);return StrUtil.isBlank(data) ? null : JSONUtil.parseArray(data).toList(clazz);}
}

测试类,和上面基本类似

  @Testvoid test() throws JsonProcessingException {JsonObj js = JsonObj.builder().str("这真的是一个简单的测试对象").build();Map<String,Object> map =  new HashMap<>();map.put("gaga","乱杀");List<JsonObj> jsonObjs = new ArrayList<>();for (int i = 0; i < 10; i++) {JsonObj js0 = JsonObj.builder().id(i).str("这真的是一个简单的测试对象").build();jsonObjs.add(js0);}Json build = Json.builder().mapJson(map).listJson(jsonObjs).objJson(js).build();jsonMapper.insert(build);}@Testvoid test1(){List<Json> select = jsonMapper.select();System.out.println(select);}

相关文章:

Mybatis自动映射Java对象 与 MySQL8后的JSON数据

文章目录 Mybatis自动映射Java对象 与 MySQL8后的JSON数据1.转化成为正常Json类型1.1 JsonTypeHander1.2 ListJsonTypeHandler 负责List<T> 类型1.3 实体类1.4 mapper1.5 测试类 2. 存储为携带类型的Json Mybatis自动映射Java对象 与 MySQL8后的JSON数据 1.转化成为正常…...

【JavaScript】深拷贝和浅拷贝

在 JavaScript 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是两种不同的对象复制方法&#xff0c;它们涉及到如何复制对象的属性以及如何处理对象内部的嵌套引用。以下是它们的解释&#xff1a; 浅拷贝&#xff08;S…...

【SLAM】10.纵观SLAM,对比方案和未来方向

"天下谁人配白衣” SLAM方案研究方向 SLAM方案 站在历史角度&#xff0c;看一下为SLAM的发展带来贡献的方案&#xff1a; 2007年—A.J.Davison—MonoSLAM 视觉SLAM的先驱&#xff0c;建立在EKF基础上&#xff0c;此前基本无法在线运行&#xff0c;意义较大&#xff1b;…...

PyTorch中DistributedDataParallel使用笔记

1. 基本概念 在使用DistributedDataParallel时有一些概率必须掌握 多机多卡含义world_size代表有几台机器&#xff0c;可以理解为几台服务器rank第几台机器&#xff0c;即第几个服务器local_rank某台机器中的第几块GPU 单机多卡含义world_size代表机器一共有几块GPUrank第几…...

前端面试的话术集锦第 18 篇博文——高频考点(HTTP协议 TLS协议)

这是记录前端面试的话术集锦第十八篇博文——高频考点(HTTP协议 & TLS协议),我会不断更新该博文。❗❗❗ 1. HTTP 请求中的内容 HTTP请求由三部分构成,分别为: 请求行 首部 实体 请求行大概长这样GET /images/logo.gif HTTP/1.,基本由请求方法、URL、协议版本组成,…...

SQL Server 数据库变成单个用户怎么办

参考技术A 1、首先我们打开SQL SERVER的管理控制台&#xff0c;找到一个要设置角色的用户。 2、下面我们将为这个用户赋予创建数据库的角色&#xff0c;我们先用这个用户登录管理工具看一下是否具有创建用户的权限。 3、进行数据库创建的时候&#xff0c;提示如下的错误&…...

错过成考报名,今年你还有这两种方式升学!

2023年广东成人高考已经报名结束啦 错过报名或没有抢到考位的同学不用伤心 你还有另外两个提升学历的机会 开放大学or小自考 今天一起来了解一下吧~ 什么是开放大学&#xff1f; 开放教育其实也就是开放大学&#xff0c;也就是我们所说的中央广播电视大学&#xff0c;现在…...

【2023】从事务的特征以及解决方式上分析MySQL是如何保证事务的

----以MySQL的InnoDB介绍 目录 前言事务&#xff0c;事务到底是什么&#xff1f; 一、事务的特征&#xff1a;二、事务特征具体保证1、Redo Log(重做日志) ---保证事务的持久性1.1、&#x1f7e1;刷盘时机1.2、redo log记录形式1.3、redo log日志的好处 2、undo log(回滚日志)…...

MTR 网络连通性测试工具 基础入门 整理

MTR MTR的全称是 my traceroute&#xff0c;是一个集合了 ping 与 traceroute 功能的网络诊断工具&#xff0c;广泛应用于链路测试。相对于 traceroute 只会做一次链路跟踪测试&#xff0c;mtr会对链路上的相关节点做持续探测并给出相应的统计信息。因此&#xff0c;mtr能避免…...

Linux安装mysql数据库并实现主从搭建

一.环境说明 【环境说明】&#xff1a; 192.168.110.161 mysql-master ##网络配置到位&#xff0c;防火墙关闭&#xff0c;selinux关闭 192.168.110.162 mysql-slave ##网络配置到位&#xff0c;防火墙关闭&#xff0c;selinux关闭 两台主机&#xff0c;操作系统是centos7…...

windows使用小技巧之windows照片查看器无法显示此图片

碰到过好几次了&#xff0c;以前没有理会&#xff0c;今天特意去查了一下解决方法&#xff0c;不然确实不太方便。 1、打开“颜色管理”-“高级”&#xff1a; 2、将“设备配置文件”选择为“Agfa&#xff1a;Swop Standard” 3、关闭&#xff0c;重新打开图片&#xff0c;好…...

ez_pz_hackover_2016

ez_pz_hackover_2016 Arch: i386-32-little RELRO: Full RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位&#xff0c;保护全关 int chall() {size_t v0; // eaxint result; // eaxchar s[1024]…...

解决方案| anyRTC远程检修应用场景

背景 在这个科技飞速发展的时代&#xff0c;各行各业都要求高效运转。然而&#xff0c;当出现问题时&#xff0c;我们却常常因为无法及时解决而感到困扰&#xff0c;传统解决问题的方式是邀请技术人员现场解决问题&#xff0c;如果技术人员解决不了&#xff0c;还要邀请专家从…...

IC芯片测试:如何对芯片静态功耗进行测试?

静态功耗也叫静态电流&#xff0c;是指芯片在静止状态下的电流或者是指芯片在不受外界因素影响下自身所消耗的电流。静态功耗对于芯片来说是衡量一款芯片的功耗与效率非常重要的指标。 传统手动测试静态功耗只需在芯片的输入端串上一台万用表&#xff0c;然后对芯片各个端口添加…...

Redis面试二“缓存击穿是什么”

条件 缓存击穿是应为Redis某个缓存数据设置了过期时间&#xff0c;而刚好有大并发数据请求这个数据&#xff0c;导致DB有大量请求&#xff0c;引发DB崩溃。 第一种方法就是设置互称锁 当缓存失效时不立即删除缓存而是用setnx设置一个互斥锁&#xff0c;当操作完成后在load db…...

python使用apscheduler每隔一段时间自动化运行程序

apscheduler使用比较简单&#xff0c;每隔一段时间自动化运行的步骤是&#xff1a; 创建调度器scheduler BlockingScheduler()添加任务scheduler.add_job(函数名, interval, minutes30) # 每隔30分钟运行一次直接执行&#xff1a;scheduler.start()示例代码 from datetime i…...

2023 Sui Builder House全球之旅圆满收官

2023年的最后一场Builder House于上周在新加坡举行&#xff0c;包括主题演讲、小组讨论和研讨会等聚焦Sui的现在和未来的活动。其中&#xff0c;zkLogin是本次活动的最大亮点。作为一种新的Sui原语&#xff0c;zkLogin允许用户使用Web2身份验证创建帐户&#xff0c;有望推动大规…...

OpenCV自学笔记二十三:K近邻算法

K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;是一种常用的监督学习算法&#xff0c;可以用于分类和回归问题。在OpenCV中&#xff0c;KNN算法有相应的函数实现&#xff0c;主要包含在ml模块中。 KNN算法的原理很简单&#xff0c;它基于样本之间的…...

ChatGLM-中英对话大模型-6B试用说明

ChatGLM-中英对话大模型-6B试用说明 搭建环境下载模型测试模型结果 搭建环境 pip install modelscope1.4.3 -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html pip install protobuf3.20.0 transformers4.27.1 icetk cpm_kernels下载模型 from modelsco…...

小白入门pytorch(一)

本文为小白入门Pytorch中的学习记录博客 小白入门pytorch 基础知识 导入torch&#xff0c;查看torch版本 import torch print(torch.__version__)输出结果&#xff1a; 1.12.1cu113张量 在pytorch中&#xff0c;张量&#xff08;tensor&#xff09;是最基本的数据结构。 …...

金蝶发布企业AI操作系统“灵基”,引领企业进入AI原生时代

5月20日&#xff0c;金蝶AI峰会2026在深圳成功举办&#xff0c;本次峰会通过线上线下同步召开&#xff0c;汇聚产学研先锋力量&#xff0c;共探智能未来。会上&#xff0c;金蝶正式发布企业AI操作系统“灵基(Lingee)”。这不仅是金蝶AI战略的全面跃迁&#xff0c;更是驱动企业管…...

Anubis质检报告XTR文件:从数据字段到质量评估的实战解析

1. XTR文件基础&#xff1a;GNSS质检报告的核心载体 第一次拿到Anubis生成的XTR文件时&#xff0c;我盯着满屏的缩写和数据愣了半天。这种看似晦涩的文本文件&#xff0c;实际上是GNSS数据质量的"体检报告单"。就像医院的血常规化验单需要专业解读一样&#xff0c;XT…...

IPv6网络规划必看:华为设备上DHCPv6与SLAAC(无状态地址分配)到底怎么选?

IPv6网络规划实战&#xff1a;华为设备地址分配方案深度解析 在IPv6网络部署的浪潮中&#xff0c;地址分配策略的选择往往成为困扰网络架构师的首要难题。当传统IPv4的DHCP方式遇上IPv6全新的SLAAC&#xff08;无状态地址自动配置&#xff09;机制&#xff0c;技术决策的复杂性…...

探索Harepacker复活版:打造你的MapleStory创意工坊

探索Harepacker复活版&#xff1a;打造你的MapleStory创意工坊 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected 你是否曾经梦想过亲手改造Map…...

Perplexity社会新闻搜索响应延迟突增47%?独家披露其底层新闻图谱更新机制与3类高危缓存失效场景

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity社会新闻搜索响应延迟突增47%&#xff1f;独家披露其底层新闻图谱更新机制与3类高危缓存失效场景 Perplexity 社会新闻搜索服务近期观测到 P95 响应延迟从 320ms 飙升至 468ms&#xff0c;增幅达 4…...

从ChatGLM2到LLaMA2:大厂如何用GQA和MQA在推理速度与模型质量间做取舍?

大模型注意力机制实战&#xff1a;GQA与MQA如何重塑推理效率与生成质量的平衡 当ChatGLM2-6B在推理速度上展现出惊人优势时&#xff0c;技术团队发现其生成质量偶尔会出现波动&#xff1b;而LLaMA2虽然保持了稳定的输出品质&#xff0c;却在资源消耗上让不少企业望而却步。这背…...

DLSS Swapper:免费开源的游戏性能优化终极解决方案

DLSS Swapper&#xff1a;免费开源的游戏性能优化终极解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为PC游戏玩家设计的免费开源工具&#xff0c;它能够智能管理、下载和替换游戏中的DL…...

点支式玻璃幕墙张拉索杆结构设计原理

点支式玻璃幕墙张拉索杆结构设计原理 一、问题的提出   张拉索杆结构点支式玻璃幕墙在我国使用时间虽然不长,但其发展相当迅猛,2002年达到年使用量约70万m2。我们必须清醒的看到此类结构在国内出现时间不长,同工程应用相比,理论研究相对滞后,对此类结构还缺乏深入研究,…...

MC/DC覆盖率:从原理到实战,破解100%覆盖率的迷思与挑战

1. 项目概述&#xff1a;当“完美”成为负担在软件测试领域&#xff0c;尤其是对安全关键系统&#xff08;比如航空航天、汽车电子、医疗设备&#xff09;的验证&#xff0c;我们常常听到一个词&#xff1a;100%覆盖率。这听起来像是一个终极目标&#xff0c;一个完美的终点。但…...

什么是数字员工?AI销冠系统与AI提效软件系统在提升销售效率中的关键角色是什么?

数字员工成为一种新兴的AI销售工具&#xff0c;正在为企业优化业务流程和提升运营效率提供巨大助力。这些智能化的虚拟职员能够处理大量的客户咨询&#xff0c;全天候地维护客户关系&#xff0c;显著减少了人力资源的消耗。依靠AI销冠系统&#xff0c;这些数字员工除了实时分析…...