java通过SQLUtils解析sql语句表明或表别名
时间: 2023-07-01 13:28:53 浏览: 160
是可以的。使用SQLUtils解析SQL语句后,可以通过遍历解析后的语法树,获取SQL语句中的表名或表别名信息。具体的实现方式可以参考以下代码示例:
```
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
public class SQLParser {
public static void main(String[] args) {
String sql = "SELECT a.id, b.name FROM table_a a join table_b b on a.id = b.id where a.id = 1";
SQLSelect sqlSelect = (SQLSelect) SQLUtils.parseSingleStatement(sql);
SQLSelectQuery sqlSelectQuery = sqlSelect.getQuery();
SQLTableSource sqlTableSource = sqlSelectQuery.getFrom();
parseTableSource(sqlTableSource);
}
private static void parseTableSource(SQLTableSource sqlTableSource) {
if (sqlTableSource instanceof SQLJoinTableSource) {
SQLJoinTableSource joinTableSource = (SQLJoinTableSource) sqlTableSource;
parseTableSource(joinTableSource.getLeft());
parseTableSource(joinTableSource.getRight());
} else if (sqlTableSource instanceof SQLSubqueryTableSource) {
SQLSubqueryTableSource subqueryTableSource = (SQLSubqueryTableSource) sqlTableSource;
parseTableSource(subqueryTableSource.getSelect().getQuery().getFrom());
} else {
SQLExpr sqlExpr = sqlTableSource.getExpr();
if (sqlExpr instanceof SQLName) {
SQLName sqlName = (SQLName) sqlExpr;
String tableName = sqlName.getSimpleName();
String tableAlias = sqlTableSource.getAlias();
System.out.println("Table name: " + tableName + ", alias: " + tableAlias);
} else if (sqlExpr instanceof SQLIdentifierExpr) {
SQLIdentifierExpr sqlIdentifierExpr = (SQLIdentifierExpr) sqlExpr;
String tableName = sqlIdentifierExpr.getName();
String tableAlias = sqlTableSource.getAlias();
System.out.println("Table name: " + tableName + ", alias: " + tableAlias);
}
}
}
}
```
在上述代码中,我们首先使用SQLUtils解析SQL语句,并获取SQL语句中的表源信息。然后,我们通过遍历表源信息的语法树,逐一获取表名和表别名信息。对于多表连接查询和子查询的情况,我们通过递归的方式进行处理。