1. 程式人生 > >druid SQL parser入門

druid SQL parser入門

防禦 bst 英文 sta 測試 責任 schema lib 表達

簡介

druid

druid是alibaba在github上開源的項目,它是一個組件庫,包含了數據庫連接池、Sql parser等組件。

wiki地址:https://github.com/alibaba/druid/wiki/%E9%A6%96%E9%A1%B5

DruidDataSource號稱是Java語言中最全面最好的連接池,理論上支持所有的JDBC驅動的數據源(實際測試並未把所有數據源測試一遍)。我們對他的了解也更多地是在如何將它作為連接池應用在程序中。

SQL parser

而SQL parser是druid的重要組成部分,SQL parser在druid中承擔著重要責任,如:SQL解析、防禦SQL註入、格式化、分庫分表等。

SQL parser wiki地址:https://github.com/alibaba/druid/wiki/SQL-Parser

SQL parser的結構

在說如何去使用SQL parser之前我們很有必要先來了解一下SQL parser的結構,它主要分為三個部分:

1、parser:SQL解析器

2、ast:抽象語法樹

3、visitor:訪問者

parser

parser是一個SQL解析器,它主要的作用就是將文本轉換為ast。parser包含兩個部分:

1、lexer:lexer做詞法解析;

2、parser:parser做語法解析。

舉個例子:你看到一句英文She is a girl,那麽你首先要做詞法解析獲得She,is,a,girl這個四個單詞,然後做主謂賓的語法解析,然後你知道了它表達的意思。

解析SQL也是差不多的,你需要通過lexer知道是有哪些詞,然後這些次構成了什麽語法。而經過詞法、語法解析以後輸出的結果就是抽象語法樹。

ast

ast全稱是abstract syntax tree,中文直譯抽象語法樹,ast是parser的輸出結果,所以我們很有必要知道ast是什麽樣的,也從而知道了parser做了一堆解析式為了得到什麽。

具體參考官方文檔druid_sql_ast:https://github.com/alibaba/druid/wiki/Druid_SQL_AST

visitor

SQLparser采用了訪問者模式,如果你了解訪問者模式那麽應該比較輕易能理解visitor的作用,它的作用就是對外提供訪問ast的接口,通過實現不同的visitor可以根據不同的需求來提供不同的訪問接口。

druid內置的訪問接口有如下幾種:

1、OutputVisitor:用來把ast輸出為字符串;

2、WallVisitor:分析SQL語義,防止SQL註入;

3、ParameterizedOutputVisitor:合並未參數化的SQL進行統計;

4、EvalVisitor:對SQL表達式進行求值;

5、ExportParameterVisitor:提取SQL中的變量參數;

6、SchemaStatVisitor:用來統計SQL中使用的表、字段、過濾條件、排序表達式、分組表達式;

7、SQL格式化:druid內置了基於語義的格式化功能。

當然,除了內置的操作,你也可以自定義visitor。

druid SQL parser入門