将Map存到数据库中,并且支持数据类型原样取回

1.数据库设计

1.1 表设计

create table variables
(id                     bigint       not null comment '主键',business_key           varchar(128) null comment '业务key',`key`                  varchar(128) null comment 'Map中的key',value                  varchar(255) null comment 'Map中的value',data_type              varchar(32)  null comment '数据类型',created                datetime     null comment '创建时间',modified               datetime     null comment '修改时间',yn                     int          null comment '数据是否有效,1:有效,0:无效'
)comment '自定义变量表';

2.程序逻辑

2.0 原始要保存数据saveMap(仅仅支持所有的基本类型):

        char[] charArray = "2".toCharArray();Character c = new Character(charArray[0]);boolean bool = Boolean.TRUE;Byte byte2 = new Byte("9");byte byt = 8;Short aShort = new Short("12");short st = 56;long l = 22;Long l2 = new Long("23");Map<String, Object> saveMap = new HashMap<String, Object>();saveMap.put("int", 12);saveMap.put("Integer", new Integer(180));saveMap.put("double", 12.0);saveMap.put("Double", new Double(180));saveMap.put("char", charArray[0]);saveMap.put("Character", c);saveMap.put("boolean", bool);saveMap.put("Boolean", Boolean.FALSE);saveMap.put("byt", byt);saveMap.put("Byte", byte2);saveMap.put("short", st);saveMap.put("Short", aShort);saveMap.put("long", l);saveMap.put("Long", l2);saveMap.put("float", 36.12);saveMap.put("Float", new Float("35.64"));saveMap.put("String", "NIKE");saveMap.put("BigDecimal", new BigDecimal("12.36"));

2.1 第一步:模拟保存到数据库,将value与key、数据类型保存到数据库

        // 模拟保存数据库Map<String, String> dbJsonMap = new HashMap<String, String>();for (Map.Entry<String, Object> entry : saveMap.entrySet()) {String key = entry.getKey();Object value = entry.getValue();String dataType = getPackagingPrimitiveType(value);dbJsonMap.put(key, JSON.toJSONString(entry.getValue()));// 保存到数据库....省略,要保持的值为key、value、dataType}

2.2 第二步:从数据库取回数据并转换,假定转换后的数据为 returnMap

 // 从数据库查询数据并转换,假定从数据库查询回来的数据为 dbJsonMapMap<String, Object> returnMap = new HashMap<String, Object>();// 模拟从数据库取回数据,并转换得到returnMap。如果程序运行正常returnMap与原石的saveMap应该完全一致for (Map.Entry<String, String> entry : dbJsonMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();String dataType = getPackagingPrimitiveType(saveMap.get(key));// 假设key、value、dataType是从数据库取回的Object originTypeValue = getObjectByDataType(dataType, value);returnMap.put(key, originTypeValue);}

2.3 第三步:对比原始的saveMap是否与returnMap完全一致

boolean equal = mapIsEqual(saveMap, returnMap);if (equal) {System.out.println("保存到数据库中的saveMap与从数据库查取回并转换后的returnMap完全一致");}
public static boolean mapIsEqual(Map<?, ?> map1, Map<?, ?> map2) {if (map1 == null || map2 == null) {return map1 == map2;}if (map1.size() != map2.size()) {return false;}for (Map.Entry<?, ?> entry : map1.entrySet()) {Object key = entry.getKey();Object value = entry.getValue();if (!map2.containsKey(key) || !map2.get(key).equals(value)) {return false;}}return true;}

2.4 用到的工具类

/*** 将JSON字符串转换为对应实例类型* @param dataType dataType* @param value value* @return 转换后的类型*/static Object getObjectByDataType(String dataType, String value) {if (StringUtils.isBlank(dataType) || StringUtils.isBlank(value)) {return null;}return JSON.parseObject(value, getInitialTypeClass(dataType));}/*** 数据类型判断* @param obj obj* @return 数据类型*/static String getPackagingPrimitiveType(Object obj) {if (obj == null) {return null;}// 初始类型if (obj == int.class) {return "int";} else if (obj == double.class) {return "double";} else if (obj == char.class) {return "char";} else if (obj == boolean.class) {return "boolean";} else if (obj == byte.class) {return "byte";} else if (obj == short.class) {return "short";} else if (obj == long.class) {return "long";} else if (obj == float.class) {return "float";// 包装类型} else if (obj instanceof Integer) {return "Integer";} else if (obj instanceof Double) {return "Double";} else if (obj instanceof Character) {return "Character";} else if (obj instanceof Boolean) {return "Boolean";} else if (obj instanceof Byte) {return "Byte";} else if (obj instanceof Short) {return "Short";} else if (obj instanceof Long) {return "Long";} else if (obj instanceof Float) {return "Float";} else if (obj instanceof String) {return "String";} else if (obj instanceof BigDecimal) {return "BigDecimal";} else {throw new RuntimeException("数据类型判断-参数不是基本包装数据类型");}}/*** 获取实例类型* @param dataType dataType* @return 实例类型*/static Class<?> getInitialTypeClass(String dataType) {if (dataType == null) {return null;}if ("int".equals(dataType)) {return int.class;} else if ("double".equals(dataType)) {return double.class;} else if ("char".equals(dataType)) {return char.class;} else if ("boolean".equals(dataType)) {return boolean.class;} else if ("byte".equals(dataType)) {return byte.class;} else if ("short".equals(dataType)) {return short.class;} else if ("long".equals(dataType)) {return long.class;} else if ("float".equals(dataType)) {return float.class;} else if ("Integer".equals(dataType)) {return Integer.class;} else if ("Double".equals(dataType)) {return Double.class;} else if ("Character".equals(dataType)) {return Character.class;} else if ("Boolean".equals(dataType)) {return Boolean.class;} else if ("Byte".equals(dataType)) {return Byte.class;} else if ("Short".equals(dataType)) {return Short.class;} else if ("Long".equals(dataType)) {return Long.class;} else if ("Float".equals(dataType)) {return Float.class;} else if ("String".equals(dataType)) {return String.class;} else if ("BigDecimal".equals(dataType)) {return BigDecimal.class;} else {throw new RuntimeException("获取实例类型-参数不是基本包装数据类型");}}

3.完整代码

public static void main(String[] args) {char[] charArray = "2".toCharArray();Character c = new Character(charArray[0]);boolean bool = Boolean.TRUE;Byte byte2 = new Byte("9");byte byt = 8;Short aShort = new Short("12");short st = 56;long l = 22;Long l2 = new Long("23");Map<String, Object> saveMap = new HashMap<String, Object>();saveMap.put("int", 12);saveMap.put("Integer", new Integer(180));saveMap.put("double", 12.0);saveMap.put("Double", new Double(180));saveMap.put("char", charArray[0]);saveMap.put("Character", c);saveMap.put("boolean", bool);saveMap.put("Boolean", Boolean.FALSE);saveMap.put("byt", byt);saveMap.put("Byte", byte2);saveMap.put("short", st);saveMap.put("Short", aShort);saveMap.put("long", l);saveMap.put("Long", l2);saveMap.put("float", 36.12);saveMap.put("Float", new Float("35.64"));saveMap.put("String", "NIKE");saveMap.put("BigDecimal", new BigDecimal("12.36"));// 模拟保存数据库Map<String, String> dbJsonMap = new HashMap<String, String>();for (Map.Entry<String, Object> entry : saveMap.entrySet()) {String key = entry.getKey();Object value = entry.getValue();String dataType = getPackagingPrimitiveType(value);dbJsonMap.put(key, JSON.toJSONString(entry.getValue()));// 保存到数据库....省略,要保持的值为key、value、dataType}// 从数据库查询数据并转换,假定从数据库查询回来的数据为 dbJsonMapMap<String, Object> returnMap = new HashMap<String, Object>();// 模拟从数据库取回数据,并转换得到returnMap。如果程序运行正常returnMap与原石的saveMap应该完全一致for (Map.Entry<String, String> entry : dbJsonMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();String dataType = getPackagingPrimitiveType(saveMap.get(key));// 假设key、value、dataType是从数据库取回的Object originTypeValue = getObjectByDataType(dataType, value);returnMap.put(key, originTypeValue);}boolean equal = mapIsEqual(saveMap, returnMap);if (equal) {System.out.println("保存到数据库中的saveMap与从数据库查取回并转换后的returnMap完全一致");}}public static boolean mapIsEqual(Map<?, ?> map1, Map<?, ?> map2) {if (map1 == null || map2 == null) {return map1 == map2;}if (map1.size() != map2.size()) {return false;}for (Map.Entry<?, ?> entry : map1.entrySet()) {Object key = entry.getKey();Object value = entry.getValue();if (!map2.containsKey(key) || !map2.get(key).equals(value)) {return false;}}return true;}/*** 将JSON字符串转换为对应实例类型* @param dataType dataType* @param value value* @return 转换后的类型*/static Object getObjectByDataType(String dataType, String value) {if (StringUtils.isBlank(dataType) || StringUtils.isBlank(value)) {return null;}return JSON.parseObject(value, getInitialTypeClass(dataType));}/*** 数据类型判断* @param obj obj* @return 数据类型*/static String getPackagingPrimitiveType(Object obj) {if (obj == null) {return null;}// 初始类型if (obj == int.class) {return "int";} else if (obj == double.class) {return "double";} else if (obj == char.class) {return "char";} else if (obj == boolean.class) {return "boolean";} else if (obj == byte.class) {return "byte";} else if (obj == short.class) {return "short";} else if (obj == long.class) {return "long";} else if (obj == float.class) {return "float";// 包装类型} else if (obj instanceof Integer) {return "Integer";} else if (obj instanceof Double) {return "Double";} else if (obj instanceof Character) {return "Character";} else if (obj instanceof Boolean) {return "Boolean";} else if (obj instanceof Byte) {return "Byte";} else if (obj instanceof Short) {return "Short";} else if (obj instanceof Long) {return "Long";} else if (obj instanceof Float) {return "Float";} else if (obj instanceof String) {return "String";} else if (obj instanceof BigDecimal) {return "BigDecimal";} else {throw new RuntimeException("数据类型判断-参数不是基本包装数据类型");}}/*** 获取实例类型* @param dataType dataType* @return 实例类型*/static Class<?> getInitialTypeClass(String dataType) {if (dataType == null) {return null;}if ("int".equals(dataType)) {return int.class;} else if ("double".equals(dataType)) {return double.class;} else if ("char".equals(dataType)) {return char.class;} else if ("boolean".equals(dataType)) {return boolean.class;} else if ("byte".equals(dataType)) {return byte.class;} else if ("short".equals(dataType)) {return short.class;} else if ("long".equals(dataType)) {return long.class;} else if ("float".equals(dataType)) {return float.class;} else if ("Integer".equals(dataType)) {return Integer.class;} else if ("Double".equals(dataType)) {return Double.class;} else if ("Character".equals(dataType)) {return Character.class;} else if ("Boolean".equals(dataType)) {return Boolean.class;} else if ("Byte".equals(dataType)) {return Byte.class;} else if ("Short".equals(dataType)) {return Short.class;} else if ("Long".equals(dataType)) {return Long.class;} else if ("Float".equals(dataType)) {return Float.class;} else if ("String".equals(dataType)) {return String.class;} else if ("BigDecimal".equals(dataType)) {return BigDecimal.class;} else {throw new RuntimeException("获取实例类型-参数不是基本包装数据类型");}}

4.运行结果截图 

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

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

相关文章

机器学习概述及其主要算法

目录 1、什么是机器学习 2、数据集 2.1、结构 3、算法分类 4、算法简介 4.1、K-近邻算法 4.2、贝叶斯分类 4.3、决策树和随机森林 4.4、逻辑回归 4.5、神经网络 4.6、线性回归 4.7、岭回归 4.8、K-means 5、机器学习开发流程 6、学习框架 1、什么是机器学习 机器…

Linux C 语言 mosquitto 方式 MQTT 发布消息

1 说明 采用 mosquitto 库&#xff0c;实现对主题发布消息。 其中服务器有做限制&#xff0c;需要对应的 cilent id &#xff0c;cafile 、certfile 、keyfile 等配置 2 开发环境 采用ubuntu 直接编译调试 安装mosquitto 库 sudo apt install libmosquitto-dev sudo apt-ge…

如何通过ChatGPT优化简历帮助自己找到合适的工作

​ 通过对1000多名当前和最近的求职者进行调查发现&#xff0c;46%的人表示使用ChatGPT来撰写简历或求职信或两者兼而有之。其中大约70%确实得到了雇主更高的回应率&#xff1b;59%被录用。 2023年1月&#xff0c;三名麻省理工学院教授进行的一项研究发现&#xff0c;使用“…

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

PoseiSwap 曾在前不久分别以 IDO、IEO 的方式推出了 POSE 通证&#xff0c;但 PoseiSwap DEX 中并未向除 Zepoch 节点外的角色开放 POSE 资产的交易。而在前不久&#xff0c;PoseiSwap 推出了全新的“Poseidon”池&#xff0c;该池将向所有用户开放&#xff0c;并允许用户自由的…

Springboot中创建拦截器

目录 目的 实现过程 1、创建拦截器 2、注册拦截器 完整代码 目的 在Springboot项目中创建拦截器&#xff0c;在进入Controller层之前拦截请求&#xff0c;可对拦截到的请求内容做响应处理&#xff0c;如&#xff1a;校验请求参数、验证证书等操作&#xff1b; 实现过程 1、创…

Effective Java笔记(29)优先考虑泛型

一般来说 &#xff0c;将集合声 明参数化&#xff0c;以及使用 JDK 所提供的泛型方法&#xff0c;这些都不太困难 。编写自己的泛型会比较困难一些&#xff0c;但是值得花些时间去学习如何编写 。 以简单的&#xff08;玩具&#xff09;堆校实现为例 &#xff1a; // Object -…

诚迈科技亮相华为开发者大会2023,打造万物互联全场景生态

8月4-6日&#xff0c;华为开发者大会2023在中国松山湖盛大举行&#xff0c;诚迈科技作为华为合作伙伴携一系列基于OpenHarmony和HarmonyOS Connect的创新技术及生态成果&#xff0c;精彩亮相OpenHarmony共建展区、OpenHarmony使能展区和鸿蒙智联展区&#xff0c;吸引了众多行业…

使用Python和wxPython构建中文OCR截图工具

引言&#xff1a; 随着数字化时代的到来&#xff0c;我们经常需要从图像中提取文本信息。而在处理中文文本时&#xff0c;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术发挥着重要作用。本文将介绍如何使用Python编程语言和wxPython图…

记录线上一次mysql只能查询,不能插入或更新的bug

错误复现 突然有一天产品通知xx服务不可用&#xff0c;想着最近也没有服务更新&#xff0c;就先排查一下服务日志 使用postman测试的时候请求明显超时&#xff0c;查看日志显示是一个锁的问题 使用工具连接到mysql&#xff0c;查看information_schema.INNODB_TRX,发现有一个事…

CVE漏洞复现-CVE-2021-3493 Linux 提权内核漏洞

CVE-2021-3493 Linux 提权内核漏洞 漏洞描述 CVE-2021-3493 用户漏洞是 Linux 内核中没有文件系统中的 layfs 中的 Ubuntu over 特定问题&#xff0c;在 Ubuntu 中正确验证有关名称空间文件系统的应用程序。buntu 内核代码允许低权限用户在使用 unshare() 函数创建的用户命名…

【linux-keepalive】keepalive避免单点故障,高可用配置

keepalive: [rootproxy ~]# yum install -y keepalived [rootproxy ~]# vim /etc/keepalived/keepalived.conf global_defs {router_id proxy1 //设置路由ID号vrrp_iptables //不添加任何防火墙规则 } vrrp_instance V…

python的virtualenv虚拟环境无法激活activate

目录 问题描述&#xff1a; 解决办法&#xff1a; 解决结果&#xff1a; 问题描述&#xff1a; PS D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts> .\activate .\activate : 无法加载文件 D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts\…