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

news2024/11/26 2:25:49

1.数据库设计

1.1 表设计

create table variables
(
    id                     bigint       not null comment '主键',
    business_key           varchar(128) null comment '业务key',
    data_key               varchar(128) null comment 'Map中的key',
    data_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");
        Map map1 = new HashMap<>();
        map1.put(1, 12);
        saveMap.put("map1", map1);
        List<Long> list1 = new ArrayList();
        list1.add(2000L);
        saveMap.put("list1", list1);
        Date date = new Date();
        saveMap.put("Date", date);
        LocalDate localDate = LocalDate.now();
        saveMap.put("localDate", localDate);
        TestPersons testPerson = new TestPersons();
        saveMap.put("testPerson", testPerson);
        saveMap.put("BigDecimal", new BigDecimal("12.36"));

内部类 

    @Data
    static class TestPersons  {
        private String name = "Nike";
        private Integer age = 26;
    }
    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.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

         // 从数据库查询数据并转换,假定从数据库查询回来的数据为 dbJsonMap
        Map<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 if (obj instanceof Map) {
            return "Map";
        } else if (obj instanceof List) {
            return "List";
        } else if (obj instanceof Date) {
            return "Date";
        } else if (obj instanceof LocalDate) {
            return "LocalDate";
        } else if (obj instanceof Object) {
            return "Object";
        } 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 if ("Map".equals(dataType)) {
            return Map.class;
        } else if ("List".equals(dataType)) {
            return List.class;
        } else if ("Date".equals(dataType)) {
            return Date.class;
        } else if ("LocalDate".equals(dataType)) {
            return LocalDate.class;
        } else if ("Object".equals(dataType)) {
            return Object.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");
        Map map1 = new HashMap<>();
        map1.put(1, 12);
        saveMap.put("map1", map1);
        List<Long> list1 = new ArrayList();
        list1.add(2000L);
        saveMap.put("list1", list1);
        Date date = new Date();
        saveMap.put("Date", date);
        LocalDate localDate = LocalDate.now();
        saveMap.put("localDate", localDate);
        TestPersons testPerson = new TestPersons();
        saveMap.put("testPerson", testPerson);
        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
        }

        // 从数据库查询数据并转换,假定从数据库查询回来的数据为 dbJsonMap
        Map<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完全一致");
        }

    }


    @Data
    static class TestPersons  {
        private String name = "Nike";
        private Integer age = 26;
    }
    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 if (obj instanceof Map) {
            return "Map";
        } else if (obj instanceof List) {
            return "List";
        } else if (obj instanceof Date) {
            return "Date";
        } else if (obj instanceof LocalDate) {
            return "LocalDate";
        } else if (obj instanceof Object) {
            return "Object";
        } 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 if ("Map".equals(dataType)) {
            return Map.class;
        } else if ("List".equals(dataType)) {
            return List.class;
        } else if ("Date".equals(dataType)) {
            return Date.class;
        } else if ("LocalDate".equals(dataType)) {
            return LocalDate.class;
        } else if ("Object".equals(dataType)) {
            return Object.class;
        } else {
            throw new RuntimeException("获取实例类型-参数不是基本包装数据类型");
        }
    }

4.运行结果截图 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

35岁职业危机?不存在!体能断崖?不担心

概述 90年&#xff0c;硕士毕业&#xff0c;干了快8年的Java开发工作。现年33岁&#xff0c;再过2年就要35岁。 工作这些年&#xff0c;断断续续也看过不少35岁找不到工作&#xff0c;转行&#xff0c;降薪入职的传闻、案例。 35岁&#xff0c;甚至30岁之后&#xff0c;体能…

【Linux操作系统】文件描述符fd

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ Linux之路       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1…

easyx图形库基础:1.基本概念的介绍+图形的绘制。

基本概念的介绍图形的绘制 一.基本概念的介绍。1.为什么要使用easyx图形库2.安装easyx图形库。3.语法相关 二.图形绘制1.窗体创建和坐标的概念。1.基本窗体的创建。2.坐标概念3.改变逻辑坐标。 2.设置图形颜色1.设置描边颜色和描边样式。2.设置图形填充颜色和填充样式3.绘制图形…

【第二阶段】kotlin的函数类型作为返回类型

fun main() {//调用,返回的是一个匿名类型&#xff0c;所以info就是一个匿名函数val infoshow("",0)//info接受的返回值为匿名类型&#xff0c;此时info就是一个匿名函数println(info("kotlin",20)) }//返回类型为一个匿名函数的返回类型fun show(name:Str…

编程工具合集

须知&#xff1a; 本博文只是为了记录程序员在编程中所用到的编程工具以及效率软件&#xff0c;如有侵权&#xff0c;请告知&#xff01; VSCode 英文官网&#xff1a;https://code.visualstudio.com/ 中文官网&#xff1a;http://vscode.p2hp.com/ win下载链接&#xff1a;VS…

ModaHub魔搭社区:AI时代连接硬件和上层应用的中间层基础设施。

从类比的角度理解AI Infra:AI时代连接硬件和上层应用的中间层基础设施。传统本地部署时代,三大基础软件(数据库、操作系统、中间件)实现控制硬件交互、存储管理数据、网络通信调度等共性功能,抽象并隔绝底层硬件系统的复杂性,让上层应用开发者能够专注于业务逻辑和应用功…

Kotlin入门:变量和函数——02

目录 一、Kotlin 基本数据类型 ​编辑 二、变量 val 关键字&#xff1a; var 关键字: 类型推断: 可空类型: 三、函数 基本函数语法&#xff1a; 单表达式函数&#xff1a; 默认参数值&#xff1a; 命名参数&#xff1a; 一、Kotlin 基本数据类型 Kotlin 的基本数…

CCLINK IE 转MODBUS-RTU网关modbusrtu与485区别

远创智控YC-CCLKIE-RTU。这款产品的主要功能是将各种MODBUS-RTU、RS485、RS232设备接入到CCLINK IE FIELD BASIC网络中。 那么&#xff0c;这款通讯网关又有哪些特点呢&#xff1f;首先&#xff0c;它能够连接到CCLINK IE FIELD BASIC总线中作为从站使用&#xff0c;同时也能连…

sqlyog下载和卸载的最新详细过程,超多图快速安装或者卸载

目录 1.SQLyog的介绍2.sqlyog的下载和安装3.sqlyog的卸载 ✨ 原创不易&#xff0c;还希望各位大佬支持一下&#xff01; &#x1f44d; 点赞&#xff0c;你的认可是我创作的动力&#xff01; ⭐️ 收藏&#xff0c;你的青睐是我努力的方向&#xff01; ✏️ 评论&#xff0c…

7.5.tensorRT高级(2)-RAII接口模式下的生产者消费者多batch实现

目录 前言1. RAII接口模式封装生产者消费者2. 问答环节总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-RAI…

Netty核心源码解析(一)

Netty是什么&#xff1f; Netty是Jboss提供的一个Java 开源框架&#xff0c;主要针对TCP协议的高并发场景Netty本质是对Java NIO做了封装的网络通信框架&#xff0c;主要作用是Java NIO基本接口的封装&#xff0c;提供了网络通信中线程同步&#xff0c;编解码&#xff0c;粘包拆…

小龟带你敲排序之冒泡排序

冒泡排序 一. 定义二.题目三. 思路分析&#xff08;图文结合&#xff09;四. 代码演示 一. 定义 冒泡排序&#xff08;Bubble Sort&#xff0c;台湾译为&#xff1a;泡沫排序或气泡排序&#xff09;是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元…

Kettle系列(一)下载安装与基础配置

Kettle系列&#xff08;一&#xff09;下载安装与基础配置 说明一、下载二、目录结构三、基础配置&#xff08;1&#xff09;环境变量&#xff08;2&#xff09;kettle配置 四、连接mysql8五、连接其他数据库六、总结 说明 更新时间&#xff1a;2023/08/13 17:47 本文记录了wi…

openGauss学习笔记-38 openGauss 高级数据管理-游标

文章目录 openGauss学习笔记-38 openGauss 高级数据管理-游标38.1 语法格式38.2 参数说明38.3 示例 openGauss学习笔记-38 openGauss 高级数据管理-游标 为了处理SQL语句&#xff0c;存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游…

【Pytroch】基于决策树算法的数据分类预测(Excel可直接替换数据)

【Pytroch】基于决策树算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 决策树是一种常用的机器学习算法&#xff0c;用于分类和回归任务。它通过树状结构表示数据的决策…

Opencv4基于C++的 实时人脸检测

文章目录: 一&#xff1a;环境配置搭建(VS2015Opencv4.6) 二&#xff1a;下资源文件 第一种&#xff1a;本地生成 第二种 直接下载 三&#xff1a;代码展示 窗口布局 main.cpp test.h test.cpp 效果图◕‿◕✌✌✌&#xff1a;opencv人脸识别效果图(请叫我真爱粉) 一&…

运算器组成实验

1.实验目的及要求 实验目的 1、熟悉双端口通用寄存器组的读写操作。 2、熟悉运算器的数据传送通路。 3、验证运算器74LS181的算术逻辑功能。 4、按给定数据&#xff0c;完成指定的算术、逻辑运算。 实验要求 1、做好实验预习。掌握运算器的数据传送通路和ALU的功能特性&…

7.3.tensorRT高级(2)-future、promise、condition_variable

目录 前言1. 生产者消费者模式2. 问答环节总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-future、promise…

【算法——双指针】LeetCode 1089 复写零

千万不要被这道题标注着“简单”迷惑了&#xff0c;实际上需要注意的细节很多。 题目描述&#xff1a; 解题思路&#xff1a; 正序遍历&#xff0c;确定结果数组的最后一个元素所在的位置&#xff1b;知道最后一个元素的位置后倒序进行填充。 先找到最后一个需要复写的数 先…

C++ 泛型编程:函数模板

文章目录 前言一、什么是泛型编程二、函数模板三、函数模板的使用四、多参数函数模板五&#xff0c;示例代码&#xff1a;总结 前言 当需要编写通用的代码以处理不同类型的数据时&#xff0c;C 中的函数模板是一个很有用的工具。函数模板允许我们编写一个通用的函数定义&#…