1. 添加sql解析测试demo

topo_dev
xueqingkun 9 months ago
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,85 @@
package com.supervision.springaidemo;
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.stat.TableStat;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class DruidTableExtractor {
public static void main(String[] args) {
String sql = "drop 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' )";
boolean b = validateSQL(sql);
System.out.println("SQL 是否合法: " + b);
String s = detectSQLType(sql);
System.out.println("SQL 类型: " + s);
List<String> tableNames = extractTableNames(sql);
System.out.println("涉及到的表: " + tableNames);
}
public static boolean validateSQL(String sql) {
try {
// 解析 SQL
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement statement = parser.parseStatement();
return true; // 解析成功SQL 语句合法
} catch (Exception e) {
// 解析异常SQL 语句不合法
System.out.println("SQL 解析错误: " + e.getMessage());
return false;
}
}
public static String detectSQLType(String sql) {
try {
// 解析 SQL
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement statement = parser.parseStatement();
// 判断 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) {
System.out.println("SQL 解析错误: " + e.getMessage());
return "ERROR";
}
}
public static List<String> extractTableNames(String sql) {
// 解析 SQL
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement statement = parser.parseStatement();
// 访问者模式提取表名
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
statement.accept(visitor);
Set<TableStat.Name> tableStatNames = visitor.getTables().keySet();
List<String> tableNames = new ArrayList<>();
for (TableStat.Name name : tableStatNames) {
tableNames.add(name.getName());
}
return 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…
Cancel
Save