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

MyBaties存储和查询json格式的数据(实体存储查询版本)

最近在做的功能,由于别的数据库有值,需要这边的不同入口的进来查询,所以需要同步过来,如果再继续一个一个生成列对应处理感觉不方便,如果没有别的操作,只是存储和查询,那就可以用MySql支持的json格式存储了。

MySql的json是5.7之后才可以处理的,所以版本一定要是这个或者比这个高呦!

首先第一步我们需要定义个处理json类型类,可以叫BaseAttributeTypeHandler,来继承BaseTypeHandler这个ibatis的类,一定要定义类型,后期传参用,

package xx;import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import io.lettuce.core.dynamic.support.ResolvableType;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.util.Assert;import java.io.IOException;
import java.lang.reflect.Type;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;/*** @Author df* @Description: 基础类, 处理mySql字段为json类型* @Date 2023/10/19 9:52*/
public abstract class BaseAttributeTypeHandler<T> extends BaseTypeHandler<Object> {private JavaType javaType;/*** ObjectMapper*/private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();/*** 构造方法*/public BaseAttributeTypeHandler() {// 通过class构造一个ResolvableType对象ResolvableType resolvableType = ResolvableType.forClass(getClass());// 获取对应泛型实体Type type = resolvableType.as(BaseAttributeTypeHandler.class).getGeneric() != null ?resolvableType.as(BaseAttributeTypeHandler.class).getGeneric().getType() :null;// 根据对应类型构造出java类型javaType = constructType(type);}private static JavaType constructType(Type type) {Assert.notNull(type, "[Assertion failed] - type is required; it must not be null");return TypeFactory.defaultInstance().constructType(type);}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, JSONUtil.toJsonStr(parameter));}@Overridepublic Object getNullableResult(ResultSet rs, String columnName) throws SQLException {String value = rs.getString(columnName);return convertToEntityAttribute(value);}@Overridepublic Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return convertToEntityAttribute(rs.getString(columnIndex));}@Overridepublic Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String value = cs.getString(columnIndex);return convertToEntityAttribute(value);}private Object convertToEntityAttribute(String dbData) {// 根据得到的数据判断类型if (StrUtil.isEmpty(dbData)) {if (List.class.isAssignableFrom(javaType.getRawClass())) {return Collections.emptyList();} else if (Set.class.isAssignableFrom(javaType.getRawClass())) {return Collections.emptySet();} else if (Map.class.isAssignableFrom(javaType.getRawClass())) {return Collections.emptyMap();} else {return null;}}return toObject(dbData, javaType);}private static <T> T toObject(String json, JavaType javaType) {Assert.hasText(json, "[Assertion failed] - this json must have text; it must not be null, empty, or blank");Assert.notNull(javaType, "[Assertion failed] - javaType is required; it must not be null");try {// 给对象设置值return (T) OBJECT_MAPPER.readValue(json, javaType);} catch (com.fasterxml.jackson.core.JsonParseException e) {throw new RuntimeException(e.getMessage(), e);} catch (JsonMappingException e) {throw new RuntimeException(e.getMessage(), e);} catch (IOException e) {throw new RuntimeException(e.getMessage(), e);}}
}

定义要存储的json类型的实体类,假如存储个用户信息把,我们就定义了UserSportTypeHandler,然后继承刚才的类BaseAttributeTypeHandler,传入json实体UserSport(你们自己定义的要存储或者查询出来的实体哈)

public class UserSportTypeHandler extends BaseAttributeTypeHandler<UserSport> {
}

存储时在po实体里添加如下的说明,好让MySql知道是json,这里的typeHandler则定义为UserSportTypeHandler

   
@Data
public class User {private Long id;private String username;@TableField(jdbcType = JdbcType.OTHER, typeHandler = UserSportTypeHandler.class)private UserSport userSport;}

新增

调用mybatis插件直接保存即可

public class UserBusinessImpl extends ServiceImpl<UserMapper, User> implements UserBusiness {public Boolean saveSportDataBatch(List<User> users) {super.saveBatch(users);}}

测试下,可以哦,直接存储了json的数据 

当然还可以存储list以及list<json>这样的格式,可以这样改。

public class UserSportTypeHandler extends BaseAttributeTypeHandler<List<UserSport>> {
}

 也可以在mapper.xml里这样添加,也要指明typeHadler

 <insert id="saveBatch" parameterType="java.util.List">INSERT INTO user_sport_record (user_sport)<foreach collection="list" separator="," item="item">VALUES (#{item.userSport,javaType=com.uniigym.Uniiuser.infrastructure.po.HeartDistribute,typeHandler=HeartDistributeTypeHandler,jdbcType=OTHER});</foreach></insert>

查询

当然你要是自己在mapper里写,可以在resultMap下里写,示例:

<resultMap type="xx.po.User" id="user"><result property="id" column="id" jdbcType="INTEGER"/><!-- json需要配置如下才能查询出来数据 --><result typeHandler="com.uniigym.Uniiuser.common.config.mybatis.HeartDistributeTypeHandler"property="heartDistribute" column="heart_distribute"jdbcType="OTHER" javaType="com.uniigym.Uniiuser.infrastructure.po.HeartDistribute"/></resultMap>

这样查询和添加都可以用这个,但是要在sql种指定resultMap的id,但是如果实体上写了 @TableField(jdbcType = JdbcType.OTHER, typeHandler = UserSportTypeHandler.class),就不用在ResultMap标签在定义了。如果都不配置typeHandler则关于json的字段查询出来为空,只有对了查询和保存才可以处理。

相关文章:

MyBaties存储和查询json格式的数据(实体存储查询版本)

最近在做的功能&#xff0c;由于别的数据库有值&#xff0c;需要这边的不同入口的进来查询&#xff0c;所以需要同步过来&#xff0c;如果再继续一个一个生成列对应处理感觉不方便&#xff0c;如果没有别的操作&#xff0c;只是存储和查询&#xff0c;那就可以用MySql支持的jso…...

动态规划14:一和零

动态规划14&#xff1a;一和零 题目 474. 一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 …...

C#WPF嵌入字体实例

本文介绍C#WPF嵌入字体实例。 首先创建项目 添加Resources文件夹,添加字体文件,字体文件属性:生成操作为Resources,复制到输出目录:不复制 字体的使用可以采用以下两种方法: 方式一 直接引用 FontFamily="./Resources/#幼圆" 方式二 定义资源 <Applica…...

Linux——Linux权限

Linux权限 前言一、shell命令以及运行原理二、Linux权限的概念Linux权限管理文件访问者的分类&#xff08;人&#xff09;文件类型和访问权限&#xff08;事物属性&#xff09;文件权限值的表示方法文件访问权限的相关设置方法 file指令目录的权限粘滞位 总结 前言 linux的学习…...

android中gradle的kotlin编译配置选项

一、编译配置 1、Android中的配置 使用如下方式开启在Android中的gradle的kotlin编译配置&#xff1a; 该配置在其余平台不可用 android {...compileOptions {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17}kotlinOptions {jvmTar…...

【知识串联】概率论中的值和量(随机变量/数字特征/参数估计)【考研向】【按概率论学习章节总结】(最大似然估计量和最大似然估计值的区别)

就我的概率论学习经验来看&#xff0c;这两个概念极易混淆&#xff0c;并且极为重点&#xff0c;然而&#xff0c;在概率论的前几章学习中&#xff0c;如果只是计算&#xff0c;对这方面的辨析不清并没有问题。然而&#xff0c;到了后面的参数估计部分&#xff0c;却可能出现问…...

NOIP2023模拟6联测27 点餐

题目大意 有 n n n样菜品&#xff0c;每样菜品都有两个权值 a i a_i ai​和 b i b_i bi​&#xff0c;如果你选择了 k k k个菜品&#xff0c;分别为 p 1 , … , p k p_1,\dots,p_k p1​,…,pk​&#xff0c;则你的花费为 ∑ i 1 k a p i max ⁡ i 1 k b p i \sum\limits_{i…...

AMEYA360:类比半导体重磅发布车规级智能高边驱动HD7xxxQ系列

致力于提供高品质芯片的国内优秀模拟及数模混合芯片设计商上海类比半导体技术有限公司(下称“类比半导体”或“类比”)宣布推出重磅新品车规级智能高边驱动HD7xxxQ系列。该系列产品包括车规级单通道高边驱动HD70xxQ和车规级双通道智能高边驱动HD70xx2Q&#xff0c;提供不同通道…...

【HarmonyOS】鸿蒙操作系统架构

HarmonyOS架构 一. 鸿蒙系统定位二. 架构整体遵从分层设计三. HarmonyOS具有的技术特性四. HarmonyOS有三大特征 其它相关推荐&#xff1a; 软考系统架构之案例篇(架构设计相关概念) 系统架构之微服务架构 系统架构设计之微内核架构 所属专栏&#xff1a;系统架构设计师 一. 鸿…...

JSON数据

一、JSON介绍 Android应用程序界面上的数据信息大部分都是通过网络请求从服务器上获取到的&#xff0c;获取到的数据类型常见的就是JSON。JSON是一种新的数据格式&#xff0c;这种格式的数据不可以直接显示到程序的界面上&#xff0c;需要将该数据解析为一个集合或对象的形式才…...

金融领域:怎么保持电力系统连续供应?

银行作为金融领域的关键机构&#xff0c;依赖于高度可靠的电力供应&#xff0c;以保持银行操作的连续性。在电力中断或电力质量问题的情况下&#xff0c;银行可能面临严重的风险&#xff0c;包括数据丢失、交易中断和客户满意度下降。 UPS监控系统在这一背景下变得至关重要&…...

批量重命名文件夹:用数字随机重命名法管理您的文件夹

在文件管理中&#xff0c;文件夹的命名是一项至关重要的任务。一个好的文件夹命名方案可以帮助我们更高效地组织和查找文件。然而&#xff0c;随着时间的推移&#xff0c;我们可能会遇到文件夹数量过多&#xff0c;难以管理和查找的问题。为了解决这个问题&#xff0c;我们可以…...

RPC与HTTP的关系

首选理清楚关系 RPC与HTTP是两个不同维度的东西 HTTP 协议&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff0c;又叫做超文本传输协议&#xff0c;是一种传输协议&#xff0c;平时通过浏览器浏览网页网页&#xff0c;用到的就是 HTTP 协议。 而 RPC&#xff0…...

OpenCV #以图搜图:感知哈希算法(Perceptual hash algorithm)的原理与实验

1. 介绍 感知哈希算法&#xff08;Perceptual Hash Algorithm&#xff0c;简称pHash&#xff09; 是哈希算法的一种&#xff0c;主要用来做相似图片的搜索工作。 2. 原理 感知哈希算法&#xff08;pHash&#xff09;首先将原图像缩小成一个固定大小的像素图像&#xff0c;然后…...

Android多张图片rotation旋转角度叠加/重叠堆放

Android多张图片rotation旋转角度叠加/重叠堆放 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"…...

HBuilderX 自定义语法提示

在开发实践中&#xff0c;会使用到各种第三方组件&#xff0c;比如Element UI&#xff0c;通常的做法是到官网中复制模板再在本地根据设计要求进行修改&#xff0c;或是从其它已经实现的组件中复制相似的内容。但每次复制粘贴确实比较麻烦。 在HBuilderx中可以设置代码块来创建…...

Leetcode—2562.找出数组的串联值【简单】

2023每日刷题&#xff08;十四&#xff09; Leetcode—2562.找出数组的串联值 实现代码 long long findTheArrayConcVal(int* nums, int numsSize){int left 0;int right numsSize - 1;long long sum 0;while(left < right) {if(left right) {sum nums[left];break;}…...

T0外部计数输入

/*----------------------------------------------- 内容&#xff1a;通过外部按键计数进入中断执行LED取反 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff0c;头文件包含特殊功能寄存器的…...

分治法求解棋盘覆盖问题

分治法求解棋盘覆盖问题 如何应用分治法求解棋盘覆盖问题呢&#xff1f;分治的技巧在于如何划分棋盘&#xff0c;使划分后的子棋盘的大小相同&#xff0c;并且每个子棋盘均包含一个特殊方格&#xff0c;从而将原问题分解为规模较小的棋盘覆盖问题。 基本思路 棋盘覆盖问题是…...

爱写bug的小邓程序员个人博客

博客网址: http://www.006969.xyz 欢迎来到我的个人博客&#xff0c;这里主要分享我对于前后端相关技术的学习笔记、项目实战经验以及一些技术感悟。 在我的博客中&#xff0c;你将看到以下主要内容&#xff1a; 技术文章 我将会分享我在学习前后端技术过程中的一些感悟&am…...

Echarts 数据大屏实战:150套模板助力企业级可视化开发

1. 为什么企业需要Echarts数据大屏&#xff1f; 在数字化转型的浪潮中&#xff0c;数据可视化已经成为企业决策的重要工具。想象一下&#xff0c;当你的老板需要在3秒内了解公司当月销售情况、用户增长趋势和库存状态时&#xff0c;密密麻麻的Excel表格显然不是最佳选择。这时…...

如何高效使用PDF-Guru:5种实用PDF处理技巧与完整操作指南

如何高效使用PDF-Guru&#xff1a;5种实用PDF处理技巧与完整操作指南 【免费下载链接】PDF-Guru A Multi-purpose PDF file processing tool with a nice UI that supports merge, split, rotate, reorder, delete, scale, crop, watermark, encrypt/decrypt, bookmark, extrac…...

晶体塑性有限元显式代码VUMAT(同时也包含umat子程序),基于黄永刚umat的vumat子...

晶体塑性有限元显式代码VUMAT&#xff08;同时也包含umat子程序&#xff09;&#xff0c;基于黄永刚umat的vumat子送学习资料。黄永刚huang.for晶体塑性子程序具有良好的收敛性&#xff0c;以及较高的计算效率&#xff0c;在一般变形下可直接使用。 然而在一些特殊的工况下&…...

基于RIME-CNN-LSSVM回归模型的优化与预测应用——以MATLAB环境为例

RIME-CNN-LSSVM回归 基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测(可以更换为分类/单、多变量时序预测/回归&#xff0c;前私我)&#xff0c;Matlab代码&#xff0c;可直接运行&#xff0c;适合小白新手 程序已经调试好&#xff0c;无需更改…...

C++ constexpr 在工程中的应用场景

C constexpr 在工程中的应用场景 在现代C开发中&#xff0c;constexpr关键字因其强大的编译时计算能力&#xff0c;逐渐成为提升性能与代码可维护性的利器。它允许开发者在编译期完成复杂的计算和初始化&#xff0c;从而减少运行时开销&#xff0c;同时增强代码的静态安全性。…...

Qwen-Image-2512-SDNQ Web服务API集成:Node.js/Java调用生成图片完整示例

Qwen-Image-2512-SDNQ Web服务API集成&#xff1a;Node.js/Java调用生成图片完整示例 1. 服务概述与核心价值 Qwen-Image-2512-SDNQ-uint4-svd-r32 Web服务是一个基于Flask框架构建的图片生成应用&#xff0c;它将先进的AI图片生成模型封装成易于使用的Web接口。这个服务最大…...

乙巳马年·皇城大门春联生成终端W与低代码平台集成:在Dify中快速创建AI应用

乙巳马年皇城大门春联生成终端W与低代码平台集成&#xff1a;在Dify中快速创建AI应用 又到了岁末年初&#xff0c;很多朋友、商家甚至社区都在为准备春联发愁。传统方式要么自己写&#xff0c;要么找人设计&#xff0c;费时费力不说&#xff0c;风格还未必满意。现在&#xff…...

YALMIP求解器报错看不懂?从verbose到debug,教你快速定位并解决优化问题

YALMIP求解器报错看不懂&#xff1f;从verbose到debug&#xff0c;教你快速定位并解决优化问题 当你满怀期待地运行YALMIP优化代码&#xff0c;却看到命令行突然跳出一片红色报错信息时&#xff0c;那种挫败感每个优化工程师都深有体会。"No feasible solution found"…...

深入探索UEFI Shell中的dh命令:高效检测系统Protocol安装状态

1. UEFI Shell与dh命令基础认知 刚接触UEFI开发时&#xff0c;我经常遇到这样的困扰&#xff1a;某个驱动明明编译通过了&#xff0c;运行时却提示"Protocol not found"。传统做法是在代码里插入调试语句&#xff0c;用gBS->LocateProtocol检查Protocol状态&#…...

智能硬件适配引擎:让黑苹果EFI配置从技术难题到即插即用的革新方案

智能硬件适配引擎&#xff1a;让黑苹果EFI配置从技术难题到即插即用的革新方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 当你第三次尝试启动黑苹…...