1.使用druid解析sql语句
引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
2.处理sql语句
复杂的语句可能无法处理,但是大部分复杂的语句还是可以处理的文章来源:https://www.toymoban.com/news/detail-637682.html
//处理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” 表示换行符文章来源地址https://www.toymoban.com/news/detail-637682.html
3.获取sql语句的表名和ddl类型
//解析数据库获取表名
List<String> tableList = new ArrayList<>();
try {
SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sqlDDl, "mysql");
List<SQLStatement> sqlStatements = parser.parseStatementList();
if (CollectionUtils.isEmpty(sqlStatements)) {
logger.info("stmtList为空无需获取");
return;
}
for (SQLStatement sqlStatement : sqlStatements) {
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
sqlStatement.accept(visitor);
Map<TableStat.Name, TableStat> 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语句表名,判断DDL类型(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!