1. 添加sql解析测试demo
parent
164f1567b2
commit
1e7b1bf8b6
@ -0,0 +1,81 @@
|
||||
package com.supervision.utils;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.*;
|
||||
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.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class SqlParserUtil {
|
||||
|
||||
|
||||
/**
|
||||
* 解析 SQL
|
||||
* @param parser parser
|
||||
* @return null 表示解析失败
|
||||
*/
|
||||
public static SQLStatement parseStatement(SQLStatementParser parser) {
|
||||
try {
|
||||
return parser.parseStatement();
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*sql 类型
|
||||
* @param statement statement
|
||||
* @return
|
||||
*/
|
||||
public static String detectSQLType(SQLStatement statement) {
|
||||
try {
|
||||
// 判断 SQL 类型
|
||||
if (statement instanceof SQLSelectStatement) {
|
||||
return "SELECT";
|
||||
} else if (statement instanceof SQLInsertStatement) {
|
||||
return "INSERT";
|
||||
} else if (statement instanceof SQLUpdateStatement) {
|
||||
return "UPDATE";
|
||||
} else if (statement instanceof SQLDeleteStatement) {
|
||||
return "DELETE";
|
||||
} else {
|
||||
return "UNKNOWN";
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return "ERROR";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 提取 SQL 中的表名
|
||||
* @param statement statement
|
||||
* @return 表名
|
||||
*/
|
||||
public static List<String> extractTableNames(SQLStatement statement) {
|
||||
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
|
||||
statement.accept(visitor);
|
||||
|
||||
Set<TableStat.Name> tableStatNames = visitor.getTables().keySet();
|
||||
|
||||
return tableStatNames.stream().map(TableStat.Name::getName).toList();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
String sql = "select u.name, o.id FROM users u left JOIN orders o ON u.id = o.user_id left join dept d on u.id = d.id WHERE u.id = 1 and u.id in ( select id from people where name = 'dd' )";
|
||||
|
||||
MySqlStatementParser parser = new MySqlStatementParser(sql);
|
||||
SQLStatement sqlStatement = parseStatement(parser);
|
||||
if (sqlStatement == null){
|
||||
System.out.println("SQL 是否合法: " + false);
|
||||
return;
|
||||
}
|
||||
|
||||
String s = detectSQLType(sqlStatement);
|
||||
System.out.println("SQL 类型: " + s);
|
||||
|
||||
List<String> tableNames = extractTableNames(sqlStatement);
|
||||
System.out.println("涉及到的表: " + tableNames);
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package com.supervision.springaidemo;
|
||||
|
||||
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
||||
import net.sf.jsqlparser.statement.Statement;
|
||||
import net.sf.jsqlparser.statement.select.PlainSelect;
|
||||
import net.sf.jsqlparser.statement.select.Select;
|
||||
import net.sf.jsqlparser.statement.select.SelectBody;
|
||||
import net.sf.jsqlparser.statement.select.SubSelect;
|
||||
import net.sf.jsqlparser.schema.Table;
|
||||
import net.sf.jsqlparser.util.TablesNamesFinder;
|
||||
import net.sf.jsqlparser.JSQLParserException;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class SQLTableExtractor {
|
||||
public static void main(String[] args) {
|
||||
String sql = "SELECT u.name, o.id FROM users u left JOIN orders o ON u.id = o.user_id WHERE u.id = 1 and u.id in ( select id from people where name = 'dd' )";
|
||||
|
||||
try {
|
||||
Statement statement = CCJSqlParserUtil.parse(sql);
|
||||
List<String> tableNames = extractTableNames(statement);
|
||||
System.out.println("涉及到的表: " + tableNames);
|
||||
} catch (JSQLParserException e) {
|
||||
System.out.println("SQL解析错误: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private static List<String> extractTableNames(Statement statement) {
|
||||
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
|
||||
return tablesNamesFinder.getTableList(statement);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue