From fb2c9fa355cc2e09bc051677dba89f86e9c0bd00 Mon Sep 17 00:00:00 2001 From: chenjiahe <763432473@qq.com> Date: 星期一, 25 四月 2022 17:45:21 +0800 Subject: [PATCH] 修复MYSQL查询语句不兼容问题 --- src/main/java/com/hx/mybatis/aes/springbean/SqlUtils.java | 52 +++++++++++++++++++++++++ src/main/java/com/hx/mybatis/aes/springbean/MySqlInterceptor.java | 23 ++++------- 2 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/hx/mybatis/aes/springbean/MySqlInterceptor.java b/src/main/java/com/hx/mybatis/aes/springbean/MySqlInterceptor.java index cb06b46..cff0067 100644 --- a/src/main/java/com/hx/mybatis/aes/springbean/MySqlInterceptor.java +++ b/src/main/java/com/hx/mybatis/aes/springbean/MySqlInterceptor.java @@ -62,30 +62,23 @@ //杩欓噷鍙互杩涜sql淇敼 //鑾峰彇鍒板師濮媠ql璇彞 String sql = boundSql.getSql(); - String sql2 = null; //鏂板 if(sqlCommandType == SqlCommandType.INSERT){ - sql2 = SqlUtils.insertSql(sql, VariableAesKey.aesKeysTable); + sql = SqlUtils.insertSql(sql, VariableAesKey.aesKeysTable); }else if(sqlCommandType == SqlCommandType.UPDATE){ - sql2 = SqlUtils.updateSql(sql, VariableAesKey.aesKeysTable); + sql = SqlUtils.updateSql(sql, VariableAesKey.aesKeysTable); }else if(sqlCommandType == SqlCommandType.SELECT){ if(VariableAesKey.isRun == 1){ - sql2 = SqlUtils.selectSql(sql, VariableAesKey.aesKeysTable); - }else{ - sql2 = sql; + sql = SqlUtils.selectSql(sql, VariableAesKey.aesKeysTable); } }else if(sqlCommandType == SqlCommandType.DELETE){ - sql2 = SqlUtils.deleteSql(sql, VariableAesKey.aesKeysTable); - }else{ - sql2 = sql; + sql = SqlUtils.deleteSql(sql, VariableAesKey.aesKeysTable); } - if(!"err".equals(sql2)){ - //閫氳繃鍙嶅皠淇敼sql璇彞 - Field field = boundSql.getClass().getDeclaredField("sql"); - field.setAccessible(true); - field.set(boundSql, sql2); - } + //閫氳繃鍙嶅皠淇敼sql璇彞 + Field field = boundSql.getClass().getDeclaredField("sql"); + field.setAccessible(true); + field.set(boundSql, sql); return invocation.proceed(); diff --git a/src/main/java/com/hx/mybatis/aes/springbean/SqlUtils.java b/src/main/java/com/hx/mybatis/aes/springbean/SqlUtils.java index e92cd8c..f872b42 100644 --- a/src/main/java/com/hx/mybatis/aes/springbean/SqlUtils.java +++ b/src/main/java/com/hx/mybatis/aes/springbean/SqlUtils.java @@ -32,7 +32,7 @@ private static Logger logger = LoggerFactory.getLogger(SqlUtils.class.getName()); - /**鏌ヨ鍔犲瘑鏁版嵁澶勭悊锛屽彧瀵规煡璇㈠仛澶勭悊锛宻elect杩斿洖涓嶅仛澶勭悊 + /**鏌ヨ鍔犲瘑鏁版嵁澶勭悊锛屽彧瀵规煡璇㈠仛澶勭悊 * @param sql sql璇彞 * @param aesKeysTable aes绉橀挜 * @return @@ -41,6 +41,56 @@ MySqlStatementParser parser = new MySqlStatementParser(sql); SQLSelectStatement sqlStatement = (SQLSelectStatement) parser.parseSelect(); + + //鑾峰彇琛ㄥ拰鍒悕 + ExportTableAliasVisitor visitorTable = new ExportTableAliasVisitor(); + sqlStatement.accept(visitorTable); + Map<String,String> tableMaps = visitorTable.getTableMap(); + + //鑾峰彇鎵�鏈夌殑瀛楁 + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + sqlStatement.accept(visitor); + //閬嶅巻鎵�鏈夊瓧娈� + Collection<TableStat.Column> columns= visitor.getColumns(); + + //澶勭悊闇�瑕佸姞瀵嗗緱瀛楁 + + if(!StringUtils.isEmpty(sql)){ + Map<String,String> aesKeys = null; + String aeskey = null; + //鎶婂墿涓嬬殑鎷兼帴涓婃潵 + String tableAl = null; + for(TableStat.Column column:columns){ + aesKeys= aesKeysTable.get(column.getTable()); + if(aesKeys == null){ + continue; + } + aeskey = aesKeys.getOrDefault(column.getName(),null); + if(StringUtils.isEmpty(aeskey)){ + continue; + } + tableAl = tableMaps.get(column.getTable()); + if(!StringUtils.isEmpty(tableAl)){ + tableAl = tableAl+"."+column.getName(); + }else{ + tableAl = column.getName(); + } + sql = sql.replaceAll("((?<!\\.)\\b"+tableAl+"\\b(?!\\.))","AES_DECRYPT(UNHEX("+tableAl+"),'"+aeskey+"')"); + } + } + return sql; + } + + + /**鏌ヨ鍔犲瘑鏁版嵁澶勭悊锛屽彧瀵规煡璇㈠仛澶勭悊锛宻elect杩斿洖涓嶅仛澶勭悊锛堝浠斤級 + * @param sql sql璇彞 + * @param aesKeysTable aes绉橀挜 + * @return + */ + public static String selectSqlDemo(String sql,Map<String,Map<String,String>> aesKeysTable){ + + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLSelectStatement sqlStatement = (SQLSelectStatement) parser.parseSelect(); //鑾峰彇鏍煎紡鍖栫殑slq璇彞 sql = sqlStatement.toString(); -- Gitblit v1.8.0