import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.stat.TableStat;
import java.util.ArrayList;
import java.util.Map;
public class SQLParserExample2 {
public static void main(String[] args) {
String sql="";
String tmpSql = sql.replaceAll("\\[shuffle\\]", "")
.replaceAll("\t", " ")
.replaceAll("--[ ]*", "-- ")
.replaceAll("=<", "<=")
.replaceAll("\r\n", "\n")
.replaceAll("[ ]+", " ")
.replaceAll("REPLACE","")
.replaceAll("replace","")
.trim();
String[] split = tmpSql.split(";");
for (String s : split) {
try {
SQLStatementParser parser = new MySqlStatementParser(s);
// 使用Parser解析生成AST,这里SQLStatement就是AST
SQLStatement sqlStatement = parser.parseStatement();
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
sqlStatement.accept(visitor);
Map<TableStat.Name, TableStat> tables = visitor.getTables();
ArrayList<String> opTables = new ArrayList<>();
ArrayList<Object> selectTables = new ArrayList<>();
for (Map.Entry<TableStat.Name, TableStat> tableStatEntry : tables.entrySet()) {
// 获取表名
String tableName = tableStatEntry.getKey().getName().replaceAll("`", "");
// 获取操作类型
String processType = tableStatEntry.getValue().toString().toLowerCase();
if (processType.contains("insert") && processType != null) {
opTables.add(tableName);
System.out.println("目标表:"+tableName);
}
if (processType.contains("select") && processType != null) {
selectTables.add(tableName);
System.out.println("来源表:"+tableName);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
java解析sql获取来源表和目标表
最新推荐文章于 2025-08-15 22:56:20 发布