druid SQL parser入门

简介

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。

猜你喜欢

转载自www.cnblogs.com/lay2017/p/9840394.html