将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 saveMap = new HashMap();
        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 dbJsonMap = new HashMap();
        for (Map.Entry 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 returnMap = new HashMap();
        // 模拟从数据库取回数据,并转换得到returnMap。如果程序运行正常returnMap与原石的saveMap应该完全一致
        for (Map.Entry 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 saveMap = new HashMap();
        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 dbJsonMap = new HashMap();
        for (Map.Entry 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 returnMap = new HashMap();
        // 模拟从数据库取回数据,并转换得到returnMap。如果程序运行正常returnMap与原石的saveMap应该完全一致
        for (Map.Entry 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.运行结果截图 

将Map存到数据库中,并且支持数据类型原样取回_第1张图片

你可能感兴趣的:(数据库,java,linux)