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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
package com.iplatform.base.util;
 
import com.walker.infrastructure.utils.StringUtils;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
 
public class DataImportUtils {
 
    /**
     * 计算要写入的数据集合,给定一个已存在的数据集合,判断当前 mapList 中哪些是不存在并需要新写入的数据。<p></p>
     * 目前使用简单的 Map 缓存已存在记录,并使用条件列值拼接字符串作为key,然后遍历 mapList筛查出来。
     * @param mapList 给定的原始数据集合
     * @param existList 已存在集合
     * @param whereColumnNames 条件字段名称集合
     * @return 返回结果,数组中包含两个集合: object[0] = insertList, object[1] = updateList
     * @date 2023-02-06
     */
    public static final Object[] calculateInsertAndUpdateList(List<Map<String, Object>> mapList
            , List<Map<String, Object>> existList, List<String> whereColumnNames){
        Object[] resultObject = new Object[2];
 
        // 只有写入集合
        if(StringUtils.isEmptyList(existList)){
            resultObject[0] = mapList;
            resultObject[1] = null;
            return resultObject;
        }
        Map<String, Integer> recordExistMap = new HashMap<>();
        StringBuilder key = null;
        for(Map<String, Object> existOne : existList){
            key = new StringBuilder();
            for(String whereColumn : whereColumnNames){
                key.append(existOne.get(whereColumn).toString());
            }
            recordExistMap.put(key.toString(), 1);
        }
 
        List<Map<String, Object>> insertList = new ArrayList<>(256);
        List<Map<String, Object>> updateList = new ArrayList<>(64);
 
        for(Map<String, Object> one : mapList){
            key = new StringBuilder();
            for(String whereColumn : whereColumnNames){
                key.append(one.get(whereColumn).toString());
            }
            // 不存在该更新记录,就属于直接写入的
            if(recordExistMap.get(key.toString()) == null){
                insertList.add(one);
            } else {
                updateList.add(one);
            }
        }
        resultObject[0] = insertList;
        resultObject[1] = updateList;
        return resultObject;
    }
 
    /**
     * 返回组装好的 where in (:param) 参数值集合,字符串类型的。
     * @param fieldName 查找条件的字段名称
     * @param mapList 原始数据Map集合。
     * @return
     * @date 2023-02-06
     */
    public static final List<String> acquireWhereInStringValues(String fieldName, List<Map<String, Object>> mapList){
        List<String> valueList = new ArrayList<>(256);
        Object value = null;
        for(Map<String, Object> map : mapList){
            value = map.get(fieldName);
            if(value == null){
                valueList.add(StringUtils.EMPTY_STRING);
            } else {
                valueList.add(value.toString());
            }
        }
        return valueList;
    }
 
    /**
     * 返回更新数据时,所有更新记录的SQL中的值几何。<p></p>
     * 如: [object[5], object[5], object[5]]
     * @param dataList
     * @param updateColumns
     * @param whereColumns
     * @return
     * @date 2023-02-05
     */
    public static final List<Object[]> acquireUpdateValues(List<Map<String, Object>> dataList
            , List<String> updateColumns, List<String> whereColumns){
        List<Object[]> list = new ArrayList<>();
        int allValueFieldSize = updateColumns.size() + whereColumns.size();
 
        Object[] parameter = null;
        for(Map<String, Object> map : dataList){
            parameter = new Object[allValueFieldSize];
            Object value = null;
            int currentPosition = 0;
            for(int i=0; i< updateColumns.size(); i++){
                // 遍历每个设置字段,根据字段名字,取出字段值
                value = map.get(updateColumns.get(i));
                parameter[currentPosition] = value;
                currentPosition ++;
            }
 
            // where 条件值
            for(int j=0; j< whereColumns.size(); j++){
                value = map.get(whereColumns.get(j));
                parameter[currentPosition] = value;
                currentPosition ++;
            }
 
            list.add(parameter);
        }
        return list;
    }
 
    /**
     * 生成更新SQL语句
     * @param tableName 表名
     * @param updateColumns 更新字段名集合
     * @param whereColumns 条件字段名集合,目前只能 and
     * @return 返回拼接的SQL语句,占位符使用:?
     * @date 2023-02-05
     */
    public static final String acquireUpdateSql(String tableName, List<String> updateColumns, List<String> whereColumns){
        StringBuilder sql = new StringBuilder("update ").append(tableName);
        sql.append(" set ");
        for(int i=0; i< updateColumns.size(); i++){
            if(i > 0){
                sql.append(StringUtils.DEFAULT_SPLIT_SEPARATOR);
            }
            sql.append(updateColumns.get(i)).append(StringUtils.CHAR_EQUALS).append("?");
        }
        if(!StringUtils.isEmptyList(whereColumns)){
            sql.append(" where ");
            for(int i=0; i< whereColumns.size(); i++){
                if(i > 0){
                    sql.append(" and ");
                }
                sql.append(whereColumns.get(i)).append(StringUtils.CHAR_EQUALS).append("?");
            }
        }
        return sql.toString();
    }
 
    /**
     * 把 Map 集合中数据转换成数组集合,方便 SQL 写入。
     * @param mapList
     * @param fieldNames
     * @return
     * @date 2023-02-06
     */
    public static final List<Object[]> translateToArray(List<Map<String, Object>> mapList, List<String> fieldNames){
        List<Object[]> list = new ArrayList<>(256);
        Object[] parameter = null;
        for(Map<String, Object> map : mapList){
            parameter = new Object[fieldNames.size()];
            for(int i=0; i< fieldNames.size(); i++){
                parameter[i] = map.get(fieldNames.get(i));
            }
            list.add(parameter);
        }
        return list;
    }
 
    /**
     * 把数组集合列表数据转换成Map集合。
     * @param dataList
     * @param fieldNames 字段名称集合
     * @return 注意:返回的Map中字段仍然按顺序,为: TreeMap
     * @date 2023-02-03
     */
    public static final List<Map<String, Object>> translateToMap(List<Object[]> dataList, List<String> fieldNames){
        if(StringUtils.isEmptyList(dataList)){
            return null;
        }
        List<Map<String, Object>> list = new ArrayList<>(dataList.size() + 2);
        Map<String, Object> map = null;
        for(Object[] row : dataList){
            map = new TreeMap<>();
            for(int i=0; i< row.length; i++){
                map.put(fieldNames.get(i), row[i]);
            }
            list.add(map);
        }
        return list;
    }
 
    /**
     * 根据表名、字段信息,生成一个 insert sql语句。
     * @param tableName
     * @param fieldNames
     * @return
     * @date 2023-02-01
     */
    public static final String acquireInsertSql(String tableName, List<String> fieldNames){
        StringBuilder sql = new StringBuilder("insert into ");
        sql.append(tableName).append("(");
        for(int i=0; i<fieldNames.size(); i++){
            if(i > 0){
                sql.append(StringUtils.DEFAULT_SPLIT_SEPARATOR);
            }
            sql.append(fieldNames.get(i));
        }
        sql.append(") values(");
 
        for(int i=0; i< fieldNames.size(); i++){
            if(i > 0){
                sql.append(StringUtils.DEFAULT_SPLIT_SEPARATOR);
            }
            sql.append("?");
        }
        sql.append(")");
        return sql.toString();
    }
}