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 中哪些是不存在并需要新写入的数据。

* 目前使用简单的 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> mapList , List> existList, List whereColumnNames){ Object[] resultObject = new Object[2]; // 只有写入集合 if(StringUtils.isEmptyList(existList)){ resultObject[0] = mapList; resultObject[1] = null; return resultObject; } Map recordExistMap = new HashMap<>(); StringBuilder key = null; for(Map existOne : existList){ key = new StringBuilder(); for(String whereColumn : whereColumnNames){ key.append(existOne.get(whereColumn).toString()); } recordExistMap.put(key.toString(), 1); } List> insertList = new ArrayList<>(256); List> updateList = new ArrayList<>(64); for(Map 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 acquireWhereInStringValues(String fieldName, List> mapList){ List valueList = new ArrayList<>(256); Object value = null; for(Map map : mapList){ value = map.get(fieldName); if(value == null){ valueList.add(StringUtils.EMPTY_STRING); } else { valueList.add(value.toString()); } } return valueList; } /** * 返回更新数据时,所有更新记录的SQL中的值几何。

* 如: [object[5], object[5], object[5]] * @param dataList * @param updateColumns * @param whereColumns * @return * @date 2023-02-05 */ public static final List acquireUpdateValues(List> dataList , List updateColumns, List whereColumns){ List list = new ArrayList<>(); int allValueFieldSize = updateColumns.size() + whereColumns.size(); Object[] parameter = null; for(Map 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 updateColumns, List 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 translateToArray(List> mapList, List fieldNames){ List list = new ArrayList<>(256); Object[] parameter = null; for(Map 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> translateToMap(List dataList, List fieldNames){ if(StringUtils.isEmptyList(dataList)){ return null; } List> list = new ArrayList<>(dataList.size() + 2); Map 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 fieldNames){ StringBuilder sql = new StringBuilder("insert into "); sql.append(tableName).append("("); for(int i=0; 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(); } }