shikeyin
2024-01-11 65da8373531677b1c37a98f53eaa30c892f35e5a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package com.iplatform.gather.util;
 
import com.walker.connector.Address;
import com.walker.connector.support.DatabaseConnector;
import com.walker.infrastructure.utils.StringUtils;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
 
import java.util.List;
import java.util.Map;
 
public class StoreUtils {
 
    /**
     * 从目的表中查询出来要更新的数据,如果不存在说明没有可更新数据,都需要插入
     * @param keys
     * @param destTableName
     * @param connector
     * @param dataList
     * @return
     */
    public static List<Map<String, Object>> loadExistDataList(String[] keys
            , String destTableName, DatabaseConnector connector, List<Object> dataList){
        StringBuilder sql = new StringBuilder();
 
        final int size = dataList.size();
 
        if(keys.length == 1){
            sql.append("select ");
            sql.append(keys[0]); // 只查询主键字段,其他字段没用
            sql.append(" from ");
            sql.append(destTableName);
            sql.append(" where ");
            sql.append(keys[0]);
            sql.append(" in(");
 
            for(int i=0; i<size; i++){
                if(i > 0){
                    sql.append(StringUtils.DEFAULT_SPLIT_SEPARATOR);
                }
                sql.append("?");
            }
            sql.append(")");
 
            //拼接参数
            Object[] params = new Object[size];
            for(int j=0; j<size; j++){
                params[j] = ((Map<Object, Object>)dataList.get(j)).get(keys[0]);
            }
 
            return connector.queryForList(sql.toString(), params);
 
        } else if(keys.length > 1){
            throw new UnsupportedOperationException("当前还未支持根据多主键,查询已经存在数据");
        }
        return null;
    }
 
    /**
     * 返回更新数据SQL
     * @param destTableName 更新表名
     * @param key 主键名称
     * @param data 提供的一条记录
     * @return
     */
    public static String getUpdateSQLByOneKey(String destTableName, String key, Map<String, Object> data){
        StringBuilder sql = new StringBuilder();
        sql.append("update ");
        sql.append(destTableName);
        sql.append(" set ");
 
        int i=0;
        for(String k : data.keySet()){
            if(i > 0){
                sql.append(StringUtils.DEFAULT_SPLIT_SEPARATOR);
            }
            sql.append(k);
            sql.append("=?");
            i++;
        }
        sql.append(" where ");
        sql.append(key);
        sql.append("=?");
        return sql.toString();
    }
 
    /**
     * 返回一个更新SQL的参数
     * @param data
     * @param idValue
     * @return
     */
    public static Object[] getUpdateParams(Map<String, Object> data, String idValue){
        int size = data.keySet().size() + 1; // 最后要加上主键值
        Object[] params = new Object[size];
        int i = 0;
        for(String k : data.keySet()){
            params[i] = data.get(k);
            i++;
        }
        params[i] = idValue;
        return params;
    }
 
    public static String getInsertSQL(Address address, List<String> fields, String destTableName
            , Map<Integer, String> cachedInsertSQL){
        int hashCode = address.hashCode() + destTableName.hashCode();
        String insertSql = cachedInsertSQL.get(hashCode);
        if(insertSql == null){
            // 分析字段,拼接insert语句
            StringBuilder sbSQL = new StringBuilder();
            sbSQL.append("insert into ").append(destTableName).append("(");
            int i = 0;
            for(String field : fields){
                if(i > 0){
                    sbSQL.append(StringUtils.DEFAULT_SPLIT_SEPARATOR);
                }
                sbSQL.append(field);
                i++;
            }
            sbSQL.append(") values(");
 
            int j = 0;
            for(String field : fields){
                if(j > 0){
                    sbSQL.append(StringUtils.DEFAULT_SPLIT_SEPARATOR);
                }
                sbSQL.append(StringUtils.SEPARATOR_COLON).append(field);
                j++;
            }
            sbSQL.append(")");
            insertSql = sbSQL.toString();
            cachedInsertSQL.put(hashCode, insertSql);
        }
        return insertSql;
    }
 
    public static final MapSqlParameterSource createMapParameter(List<String> fields, Map<String, Object> map){
        MapSqlParameterSource sps = new MapSqlParameterSource();
//        logger.debug("+++++++++++ " + json);
        for(String field : fields){
            sps.addValue(field, map.get(field));
//            logger.debug("添加参数 '" + field + "', value = " + json.get(field));
        }
        return sps;
    }
}