写点什么

druid 源码阅读(六)Druid SqlParser 介绍

  • 2022 年 5 月 15 日
  • 本文字数:840 字

    阅读完需:约 3 分钟

1、Druid SqlParser 组成

Druid SQL Parser 主要分为三个模块:Parser、AST、Visitor

parser 是将输入文本转换为 ast(抽象语法树)。

AST 是 Abstract Syntax Tree,翻译为抽象语法树,是将 SQL 当中的语法结构解析为树的结构,如

select * from t where id=1;可以解析为 select, * , t , id=1,每个都是一个节点,便于我们对这个 sql 进行处理。

Visitor 是一个接口,可以自定义他的实现用以达到我们自己对抽象语法树的遍历处理。

2、SqlParser

使用如下代码可以将 sql 字符串解析为 SQLStatement。SQLSelectStatement 是 SQLStatement 的一个实现,代表这是个 SELECT 语句。

String sql = "Select * from t where id = 3";SQLSelectStatement statement = (SQLSelectStatement) SQLUtils.parseSingleMysqlStatement(sql);
复制代码

查看 SQLSelectStatement 的属性:

protected SQLSelect select;public SQLSelect getSelect() {        return this.select;}
复制代码

管网上说:SQLSelectStatement 包含一个 SQLSelect,SQLSelect 包含一个 SQLSelectQuery,都是组成的关系。SQLSelectQuery 有主要的两个派生类,分别是 SQLSelectQueryBlock 和 SQLUnionQuery。

我们直接看下 SQLSelectQueryBlock 的属性,获取下看看:

SQLSelectStatement statement = (SQLSelectStatement) SQLUtils.parseSingleMysqlStatement(sql);SQLSelectQueryBlock sqlSelectQuery = statement.getSelect().getQueryBlock();List<SQLSelectItem> selectItems = sqlSelectQuery.getSelectList();sqlSelectQuery.getFrom();for (SQLSelectItem item :        selectItems) {    System.out.println(SQLUtils.toMySqlString(item.getExpr()));}
复制代码

从代码中可以看出来我们可以通过 SQLSelectQueryBlock 获取 sql 中对应的属性。

3、Visitor

Druid SqlParser 使用访问者模型可以对抽象语法树进行遍历处理,具体可以参考官方例子:

SQL_Parser_Demo_visitor · alibaba/druid Wiki (github.com)

4、总结

Druid SqlParser 可以让我们非常方便的解析 SQL 并对 SQL 进行处理,Druid 也据此建立了 SQL 火墙技术。

用户头像

还未添加个人签名 2021.05.30 加入

还未添加个人简介

评论

发布
暂无评论
druid 源码阅读(六)Druid SqlParser介绍_5月月更_爱晒太阳的大白_InfoQ写作社区