DruidParser解析SQL-校验重复SQL

    技术2022-07-17  70

    DruidParser解析SQL-校验重复SQL

    添加maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.26</version> </dependency> druidParser解析SQL工具类 package druid; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; import com.alibaba.druid.sql.parser.SQLParserUtils; import com.alibaba.druid.sql.parser.SQLStatementParser; import com.alibaba.druid.stat.TableStat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class DruidSqlParse { public static Map<String, List<String>> parse(String sql, String dbType) throws Exception { Map<String, List<String>> visitorMap = new HashMap<>(); SQLStatementParser statementParser = SQLParserUtils.createSQLStatementParser(sql, dbType); SQLStatement sqlStatement = statementParser.parseStatement(); MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); sqlStatement.accept(visitor); if (!visitor.getTables().isEmpty()) { List<String> tables = new ArrayList<>(); for (Map.Entry<TableStat.Name, TableStat> nameTableStatEntry : visitor.getTables().entrySet()) { tables.add(nameTableStatEntry.getKey().getName()); } visitorMap.put("tables", tables); } if (!visitor.getColumns().isEmpty()) { List<String> columns = new ArrayList<>(); for (TableStat.Column column : visitor.getColumns()) { columns.add(column.getTable() + "." + column.getName()); } visitorMap.put("columns", columns); } if (!visitor.getConditions().isEmpty()) { List<String> conditions = new ArrayList<>(); for (TableStat.Condition condition : visitor.getConditions()) { conditions.add(condition.getColumn() + condition.getOperator()); } visitorMap.put("conditions", conditions); } if (!visitor.getGroupByColumns().isEmpty()) { List<String> groupByColumns = new ArrayList<>(); for (TableStat.Column groupByColumn : visitor.getGroupByColumns()) { groupByColumns.add(groupByColumn.getTable() + "." + groupByColumn.getName()); } visitorMap.put("groupByColumns", groupByColumns); } if (!visitor.getOrderByColumns().isEmpty()) { List<String> orderByColumns = new ArrayList<>(); for (TableStat.Column orderByColumn : visitor.getOrderByColumns()) { orderByColumns.add(orderByColumn.getTable() + "." + orderByColumn.getTable()); } visitorMap.put("orderByColumns", orderByColumns); } return visitorMap; } } 测试方法 public static void main(String[] args) throws Exception { String dbType = JdbcUtils.MYSQL; String sql1 = "select * from user where id = '1' and password = 'xxx'"; String sql2 = "select * from user where id = '2' and password = 'bbb'"; String sql3 = "select * from user where id = '2' and username = 'xiaoming'"; Map<String, List<String>> sql1Map = DruidSqlParse.parse(sql1, dbType); Map<String, List<String>> sql2Map = DruidSqlParse.parse(sql2, dbType); Map<String, List<String>> sql3Map = DruidSqlParse.parse(sql3, dbType); System.out.println("sql1与sql2为同一SQL:" + sql1Map.equals(sql2Map)); System.out.println("sql1与sql3为同一SQL:" + sql1Map.equals(sql3Map)); }

    Processed: 0.008, SQL: 9