1. 什么是AST
2. 在Druid SQL Parser中有哪些AST节点类型
在Druid中,AST节点类型主要包括SQLObject、SQLExpr、SQLStatement三种抽象类型。
- package com.alibaba.druid.sql.ast.expr;
- // SQLName是一种的SQLExpr的Expr,包括SQLIdentifierExpr、SQLPropertyExpr等
- public interface SQLName extends SQLExpr {}
- // 例如 ID = 3 这里的ID是一个SQLIdentifierExpr
- class SQLIdentifierExpr implements SQLExpr, SQLName {
- String name;
- }
- // 例如 A.ID = 3 这里的A.ID是一个SQLPropertyExpr
- class SQLPropertyExpr implements SQLExpr, SQLName {
- SQLExpr owner;
- String name;
- }
- // 例如 ID = 3 这是一个SQLBinaryOpExpr
- // left是ID (SQLIdentifierExpr)
- // right是3 (SQLIntegerExpr)
- class SQLBinaryOpExpr implements SQLExpr {
- SQLExpr left;
- SQLExpr right;
- SQLBinaryOperator operator;
- }
- // 例如 select * from where id = ?,这里的?是一个SQLVariantRefExpr,name是'?'
- class SQLVariantRefExpr extends SQLExprImpl {
- String name;
- // 例如 ID = 3 这里的3是一个SQLIntegerExpr
- public class SQLIntegerExpr extends SQLNumericLiteralExpr implements SQLValuableExpr {
- Number number;
- // 所有实现了SQLValuableExpr接口的SQLExpr都可以直接调用这个方法求值
- @Override
- public Object getValue() {
- return this.number;
- }
- }
- // 例如 NAME = 'jobs' 这里的'jobs'是一个SQLCharExpr
- public class SQLCharExpr extends SQLTextLiteralExpr implements SQLValuableExpr{
- String text;
- }
2.2. 常用的SQLStatemment
- package com.alibaba.druid.sql.ast.statement;
- class SQLSelectStatement implements SQLStatement {
- SQLSelect select;
- }
- class SQLUpdateStatement implements SQLStatement {
- SQLExprTableSource tableSource;
- List<SQLUpdateSetItem> items;
- SQLExpr where;
- }
- class SQLDeleteStatement implements SQLStatement {
- SQLTableSource tableSource;
- SQLExpr where;
- }
- class SQLInsertStatement implements SQLStatement {
- SQLExprTableSource tableSource;
- List<SQLExpr> columns;
- SQLSelect query;
- }
常见的SQLTableSource包括SQLExprTableSource、SQLJoinTableSource、SQLSubqueryTableSource、SQLWithSubqueryClause.Entry
2.4. SQLSelect & SQLSelectQuery
- class SQLSelect extends SQLObjectImpl {
- SQLWithSubqueryClause withSubQuery;
- SQLSelectQuery query;
- }
- interface SQLSelectQuery extends SQLObject {}
- class SQLSelectQueryBlock implements SQLSelectQuery {
- List<SQLSelectItem> selectList;
- SQLTableSource from;
- SQLExprTableSource into;
- SQLExpr where;
- SQLSelectGroupByClause groupBy;
- SQLOrderBy orderBy;
- SQLLimit limit;
- }
- class SQLUnionQuery implements SQLSelectQuery {
- SQLSelectQuery left;
- SQLSelectQuery right;
- SQLUnionOperator operator; // UNION/UNION_ALL/MINUS/INTERSECT
- }
建表语句包含了一系列方法,用于方便各种操作
- public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLStatement, SQLCreateStatement {
- SQLExprTableSource tableSource;
- List<SQLTableElement> tableElementList;
- Select select;
- // 忽略大小写的查找SQLCreateTableStatement中的SQLColumnDefinition
- public SQLColumnDefinition findColumn(String columName) {}
- // 忽略大小写的查找SQLCreateTableStatement中的column关联的索引
- public SQLTableElement findIndex(String columnName) {}
- // 是否外键依赖另外一个表
- public boolean isReferenced(String tableName) {}
- }
3. 怎样产生AST
3.1. 通过SQLUtils产生List<SQLStatement>
- String dbType = JdbcConstants.MYSQL;
- SQLExpr expr = SQLUtils.toSQLExpr("id=3", dbType);
4. 怎样打印AST节点
4.1. 通过SQLUtils工具类打印节点
- package com.alibaba.druid.sql;
- public class SQLUtils {
- // 可以将SQLExpr/SQLStatement打印为String类型
- static String toSQLString(SQLObject sqlObj, String dbType);
- // 可以将一个<SQLStatement>打印为String类型
- static String toSQLString(List<SQLStatement> statementList, String dbType);
- }