简介
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。
原文地址:https://www.cnblogs.com/lay2017/p/9840394.html