From 3295a41694171ab6695894887c3728efb094e5ad Mon Sep 17 00:00:00 2001 From: chenjiahe <763432473@qq.com> Date: 星期三, 06 四月 2022 15:53:47 +0800 Subject: [PATCH] 优化 --- src/main/java/com/hx/mybatis/aes/springbean/InitMysqlData.java | 221 ++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 152 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/hx/mybatis/aes/springbean/InitMysqlData.java b/src/main/java/com/hx/mybatis/aes/springbean/InitMysqlData.java index 2c5abcc..712f351 100644 --- a/src/main/java/com/hx/mybatis/aes/springbean/InitMysqlData.java +++ b/src/main/java/com/hx/mybatis/aes/springbean/InitMysqlData.java @@ -3,7 +3,7 @@ import com.gitee.sunchenbin.mybatis.actable.annotation.Column; import com.gitee.sunchenbin.mybatis.actable.annotation.Table; import com.hx.common.annotations.MysqlHexAes; -import com.hx.common.dao.CommonMapper; +import com.hx.common.dao.mapper.CommonMapper; import com.hx.common.service.CommonService; import com.hx.exception.ServiceException; import com.hx.mybatisTool.SqlSentence; @@ -12,10 +12,9 @@ import javax.annotation.PostConstruct; import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class InitMysqlData { @@ -28,81 +27,165 @@ //椤圭洰鍚姩鐨勬椂鍊欏~鍏� if(!StringUtils.isEmpty(packPath)){ Set<Class<?>> classes = VariableAesKey.classData(packPath); - Map<String,String> aesKeysFild = new HashMap<>(); - boolean isAes = false; - String tableName = null; - String fildName = null; - String fildValue = null; SqlSentence sqlSentence = new SqlSentence(); Map<String,Object> values = new HashMap<>(); - for(Class<?> cl:classes){ - //琛ㄥ悕绉� - boolean hasAnnotation = cl.isAnnotationPresent(Table.class); - if(!hasAnnotation){ - continue; - } - Table table = cl.getAnnotation(Table.class); - tableName = table.name(); + //瑙f瀽琛ㄦ暟鎹� + List<FieldData> fieldDatas = entityhandle(classes); - aesKeysFild = new HashMap<>(); - isAes = false; - - // 鍙栧緱鏈被鐨勫叏閮ㄥ睘鎬� - Field[] fields = cl.getDeclaredFields(); - fields = VariableAesKey.getPatentFields(fields,cl); - for (Field field:fields) { - fildName = null; - // 鍒ゆ柇鏂规硶涓槸鍚︽湁鎸囧畾娉ㄨВ绫诲瀷鐨勬敞瑙� - hasAnnotation = field.isAnnotationPresent(MysqlHexAes.class); - if (hasAnnotation) { - // 鏍规嵁娉ㄨВ绫诲瀷杩斿洖鏂规硶鐨勬寚瀹氱被鍨嬫敞瑙� - MysqlHexAes mysqlHexAes = field.getAnnotation(MysqlHexAes.class); - - //String aesKeyField = mysqlHexAes.aesKeyField(); - String aesKey = mysqlHexAes.aesKey(); - - if(StringUtils.isEmpty(aesKey)){ - aesKey = VariableAesKey.AES_KEY; - if(StringUtils.isEmpty(aesKey)){ - throw new RuntimeException("mysql鐨凙ES绉橀挜涓嶈兘涓虹┖:"+field.getName()); + int pageSize = 500; + //鍒涘缓涓�涓畾闀跨嚎绋嬫睜锛屽彲鎺у埗绾跨▼鏈�澶у苟鍙戞暟锛岃秴鍑虹殑绾跨▼浼氬湪闃熷垪涓瓑寰呫�� + ExecutorService fixedThreadPool = Executors.newFixedThreadPool(20); + try{ + for(FieldData fieldData:fieldDatas){ + //鑾峰彇鏉℃暟 + sqlSentence.sqlSentence("SELECT COUNT(0) FROM "+fieldData.getTableName(),values); + int total = commonService.selectCountSql(sqlSentence); + if(total ==0 ){ + continue; + } + int pageTotal = total/pageSize+1; + for(int i= 0;i<pageTotal;i++){ + int finalI = i; + fixedThreadPool.execute(new Runnable() { + @Override + public void run() { + //鏇存柊鏁版嵁 + updateData(fieldData,commonService, finalI,pageSize); } - } - - hasAnnotation = field.isAnnotationPresent(Column.class); - if(hasAnnotation){ - Column column = field.getAnnotation(Column.class); - fildName = column.name(); - } - if(StringUtils.isEmpty(fildName)){ - fildName = field.getName(); - } - - sqlSentence.sqlSentence("SELECT id,"+fildName+" FROM "+tableName,values); - List<Map<String,Object>> list = commonService.selectListMap(CommonMapper.class,sqlSentence); - for(Map<String,Object> map:list){ - fildValue = (String)map.get(fildName); - System.out.println("fildValue:"+fildValue); - if(StringUtils.isEmpty(fildValue)){ - continue; - } - if(fildValue.length()%32==0 && MysqlHexAesTool.isHexStrValid(fildValue)){ - continue; - } - values.clear(); - values.put("id",map.get("id")); - values.put("filedData",fildValue); - sqlSentence.sqlSentence("UPDATE "+tableName+" SET "+fildName+" = #{m.filedData} WHERE id = #{m.id}",values); - if(commonService.updateSentence(sqlSentence)!=1){ - throw new ServiceException("鏇存柊瓒呰繃1鏉★紝鏇存柊澶辫触锛�"); - } - } + }); } } + }catch (Exception e){ + e.printStackTrace(); + }finally { + fixedThreadPool.shutdown(); } } } + /**鏇存柊鏁版嵁*/ + public static void updateData(FieldData fieldData,CommonService commonService,int pageNum,int pageSize){ + SqlSentence sqlSentence = new SqlSentence(); + Map<String,Object> values = new HashMap<>(); + + //鏌ヨ鏁版嵁 + StringBuilder selectField = new StringBuilder(); + selectField.append(fieldData.getId()); + for(String fieldName:fieldData.getEncrypFields()){ + selectField.append(","+fieldName); + } + sqlSentence.sqlSentence("SELECT "+selectField.toString()+" FROM "+fieldData.getTableName()+" LIMIT "+pageNum+","+pageSize,values); + List<Map<String,Object>> list = commonService.selectListMap(CommonMapper.class,sqlSentence); + + for (Map<String,Object> map:list){ + StringBuilder setField = new StringBuilder(); + for (Map.Entry<String, Object> entry : map.entrySet()) { + String mapKey = entry.getKey(); + String mapValue = (String) entry.getValue(); + if(StringUtils.isEmpty(mapValue)){ + continue; + } + if(mapValue.length()%32==0 && MysqlHexAesTool.isHexStrValid(mapValue)){ + continue; + } + if(fieldData.getId().equals(mapKey)){ + continue; + } + if(setField.length()>0){ + setField.append(","); + } + setField.append(mapKey+" = #{m."+mapKey+"}"); + } + + values = map; + sqlSentence.sqlSentence("UPDATE "+fieldData.getTableName()+" SET "+setField.toString()+" WHERE "+fieldData.getId()+" = #{m."+fieldData.getId()+"}",values); + + if(commonService.updateSentence(sqlSentence)!=1){ + throw new ServiceException("鏇存柊瓒呰繃1鏉★紝鏇存柊澶辫触锛�"); + } + } + + } + + /**鑾峰彇鍒拌〃鐨勬暟鎹�*/ + public static List<FieldData> entityhandle(Set<Class<?>> classes){ + + List<FieldData> fildDatas = new ArrayList<>(); + //瀛樺偍鍗曡〃瀛楁淇℃伅 + FieldData fildData; + //瀛樺偍闇�瑕佸姞瀵嗙殑瀛楁 + Set<String> encrypFields; + + String fildName; + + for(Class<?> cl:classes){ + fildData = new FieldData(); + encrypFields = new HashSet<>(); + + //琛ㄥ悕绉� + if(!cl.isAnnotationPresent(Table.class)){ + continue; + } + Table table = cl.getAnnotation(Table.class); + fildData.setTableName(table.name()); + + // 鍙栧緱鏈被鐨勫叏閮ㄥ睘鎬� + Field[] fields = cl.getDeclaredFields(); + fields = VariableAesKey.getPatentFields(fields,cl); + for (Field field:fields) { + + fildName = null; + if(field.isAnnotationPresent(Column.class)){ + Column column = field.getAnnotation(Column.class); + fildName = column.name(); + if(StringUtils.isEmpty(fildName)){ + fildName = field.getName(); + } + if(column.isKey()){ + fildData.setId(fildName); + } + }else{ + fildName = field.getName(); + } + + // 鍒ゆ柇鏂规硶涓槸鍚︽湁鎸囧畾娉ㄨВ绫诲瀷鐨勬敞瑙� + if (!field.isAnnotationPresent(MysqlHexAes.class)) { + continue; + } + // 鏍规嵁娉ㄨВ绫诲瀷杩斿洖鏂规硶鐨勬寚瀹氱被鍨嬫敞瑙� + MysqlHexAes mysqlHexAes = field.getAnnotation(MysqlHexAes.class); + //鍒ゆ柇鐗堟湰鍙锋槸涓嶆槸涓�鏍风殑 + if(!StringUtils.isEmpty(VariableAesKey.INIT_VERSION)){ + if(!VariableAesKey.INIT_VERSION.equals(mysqlHexAes.initVersion())){ + continue; + } + }else{ + if(!StringUtils.isEmpty(mysqlHexAes.initVersion())){ + continue; + } + } + + String aesKey = mysqlHexAes.aesKey(); + if(StringUtils.isEmpty(aesKey)){ + aesKey = VariableAesKey.AES_KEY; + if(StringUtils.isEmpty(aesKey)){ + throw new RuntimeException("mysql鐨凙ES绉橀挜涓嶈兘涓虹┖:"+field.getName()); + } + } + + encrypFields.add(fildName); + } + //鏄惁鏈夐渶瑕佸姞瀵嗗緱瀛楁 + if(encrypFields.size()<=0){ + continue; + } + fildData.setEncrypFields(encrypFields); + fildDatas.add(fildData); + } + return fildDatas; + } + } -- Gitblit v1.8.0