使用Druid解析SQL,获取SQL中所有使用的表

 

一、sqlParse组成

Druid SQL Parser分三个模块:

- Parser

- AST

- Visitor

1.1 Parser

parser是将输入文本转换为ast(抽象语法树),parser有包括两个部分,Parser和Lexer,其中Lexer实现词法分析,Parser实现语法分析。

1.2 AST

AST是Abstract Syntax Tree的缩写,也就是抽象语法树。AST是parser输出的结果。这也是语法树的精髓了,sql解析,本质上就是把sql转为 ast语法树,拿到这个语法树后,我们就能做很多事了,遍历也好,加点,修改也好,都可以在ast上完成。

 

星尘阁出品

二、java代码编写

 

 

 

  /**
     * 根据sql由获取sql的表名
     * @param sql
     * @param dbType  数据库类型  可以用JdbcConstants.MYSQL
     * @return Map<别名, 表名>
     */
    public static Map<String /* 别名 */, String /* 表名 */> getTables(String sql,DBType dbType) {
        List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType.name())
        Map<String, String> tables = new HashMap<String, String>();

        for (SQLStatement stmt : stmtList) {
            SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(dbType);
            stmt.accept(visitor);
            for (SQLName originalTable : visitor.getOriginalTables()) {
                if (originalTable instanceof SQLIdentifierExpr) {
                    String tableName = ((SQLIdentifierExpr) originalTable).getName();
                    SQLObject parent = originalTable.getParent();
                    String alias = null;
                    if (parent instanceof SQLPropertyExpr) {
                        alias = ((SQLPropertyExpr) parent).getResolvedTableSource().getAlias();
                    } else if (parent instanceof SQLExprTableSource) {
                        alias = ((SQLExprTableSource) parent).getAlias();
                    }
                    if (null == alias) {
                        alias = tableName;
                    }
                    tables.put(alias, tableName);
                }
            }
        }
        return tables;
    }

三、调试结果 

 

对于MLSQL JDBC的表列信息解析依赖于Druid,因此语法支持受限于Druid,目前Druid的支持如下:

数据库DMLDDL
odps完全支持完全支持
mysql完全支持完全支持
postgresql完全支持完全支持
oracle支持大部分支持大部分
sql server支持常用的支持常用的
db2支持常用的支持常用的
hive支持常用的支持常用的

四、源码支持DB类型 

目前我用的Druid是1.2.18目前源码支持的dbType类型如下

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Druid是一款数据库连接池和监控平台,可以对SQL进行解析,帮助我们实现血缘关系计算。 首先,需要在项目引入Druid的相关依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.6</version> </dependency> ``` 接着,我们可以通过Druid提供的`Parser`类来解析SQL语句: ```java import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; public class SqlParser { public static void parseSql(String sql) { // 解析SQL获取AST MySqlStatementParser parser = new MySqlStatementParser(sql); SQLStatement statement = parser.parseStatement(); // 获取查询语句部分 SQLSelectStatement selectStatement = (SQLSelectStatement)statement; // 获取AST名和列名 SchemaStatVisitor visitor = new SchemaStatVisitor(); selectStatement.accept(visitor); System.out.println(visitor.getColumns()); System.out.println(visitor.getTables()); } } ``` 以上代码,我们首先使用`MySqlStatementParser`类解析SQL语句,然后通过`SchemaStatVisitor`访问AST名和列名,从而获取血缘关系。 需要注意的是,Druid只能解析SQL语句,无法在运行时获取真实的数据和列名,因此我们需要在代码手动指定和列的信息,以便进行血缘关系计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值