获取SQL语句表名,判断DDL类型(二)

1.使用druid解析sql语句

引入依赖

 
            com.alibaba
            druid-spring-boot-starter
            1.1.9
        
2.处理sql语句

复杂的语句可能无法处理,但是大部分复杂的语句还是可以处理的

   //处理sql语句 去除ROW开头到结尾的字符串,去除换行符等,否则解析会报错
        String sqlDDl = "drop table if exists test_table05;" +
                "create table test_table15 (id int comment '自增ID',phone varchar(255) comment '手机号');" +
                "ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored AS textfile;";
        sqlDDl = sqlDDl.replaceAll("\r|\n"," ").replaceAll("(?i)ROW.*?(?=;)", " ");

“ . ”表示任意字符,“ * ”表示前面表达式匹配任意次,“ ? ”表示非贪婪模式,“ .*?” 是满足条件的情况只匹配一次,即懒惰匹配,“ ?<=A ” 表示以A开头、不替换A,“ ?=B ”表示以B结尾、不替换B,“(?i)”表示不区分大小写,“\r|\n” 表示换行符

3.获取sql语句的表名和ddl类型
 //解析数据库获取表名
        List tableList = new ArrayList<>();
        try {
            SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sqlDDl, "mysql");
            List sqlStatements = parser.parseStatementList();
            if (CollectionUtils.isEmpty(sqlStatements)) {
                logger.info("stmtList为空无需获取");
                return;
            }
            for (SQLStatement sqlStatement : sqlStatements) {
                MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
                sqlStatement.accept(visitor);
                Map tables = visitor.getTables();
                logger.info("获取的数据表名和类型:{}",tables);
                tables.forEach((tableName,tableStat)->{
                    logger.info("tableStat:{}",tableStat);
                    if("Create".equals(tableStat.toString()))
                    tableList.add( tableName.getName());
                });
            }
        } catch (Except

你可能感兴趣的:(sql,数据库)