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。

原文地址:https://www.cnblogs.com/lay2017/p/9840394.html

时间: 2024-11-07 23:45:14

druid SQL parser入门的相关文章

java sql解析器比较druid sql parser vs jsqlparser vs fdb-sql-parser

先上结论. 功能上:druid sql parser(支持分区.WITH.DUAL等.使用mysql语法解析时,已知oracle的一些操作符会被转为mysql,如|| 转为OR.使用oracle解析器时,union all里面的括号会被移到外面,从而导致可能执行出错) > jsqlparser(不支持分区) > fdb-sql-parser(不支持很复杂的SQL).因此,首先排除fdb-sql-parser.都不支持不执行SQL语句解析语义,调用preparestatement即可,不是问题.

ORA-00907: 缺失右括号问题或com.alibaba.druid.sql.parser.ParserException: TODO :IDENTIFIER的原因

以上只是说明错误的原因的一种.

利用 druid 的 sql parser 模块解析 sql 语句

druid 是阿里开源在 github 上面的数据库连接池,里面有一个专门解析 sql 语句的模块 源码位置: https://github.com/alibaba/druid SQL Parser 模块的介绍: https://github.com/alibaba/druid/wiki/SQL-Parser 相关 API: http://tool.oschina.net/apidocs/apidoc?api=druid0.26 druid 使用说明: druid 现在已经直接发布到了 mave

1.SQL语句入门

--SQL语句入门-- --1.sql语言是解释语言 --2.它不区分大小写 --3.没有“”,所有字符或者字符串都使用''包含 --4.sql里面也有类似于c#的运算符 -- 算术运算符:+ - * / % -- 关系运算符:> < >= <= =(赋值与逻辑相等都是=), <> != -- 逻辑运算符:!(not)&&(and) || (or) --5.在sql中没有BOOL值的概念,也就意味着条件中不能写true/false 但是对于bit类型的值

SQL 存储过程入门(事务)(四)

SQL 存储过程入门(事务)(四) 本篇我们来讲一下事务处理技术. 为什么要使用事务呢,事务有什么用呢,举个例子. 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我们插入的顺序是先插入A,再插入B表,如果都顺利插入成功了,当然没有问题,如果任意一张表插入失败了,而另一张表插入成功了,插入成功的表就是垃圾数据了.我们要判断,任意一张表插入失败都回滚,就是都不插入,这就是事务的基本使用. 一,sql事务定义 所谓事务是用户定义的一个数据库操作序列,是一个不可分割的工作

SQL从入门到基础&ndash;03 SQLServer基础1(主键选择、数据插入、数据更新)

一.SQL语句入门 1. SQL语句是和DBMS"交谈"专用的语句,不同DBMS都认SQL语法. 2. SQL语句中字符串用单引号. 3. SQL语句中,对于SQL关键字大小写不敏感,对于字符串值大小写敏感. 4. 创建表.删除表不仅可以手工完成,还可以执行SQL语句完成,在自动化部署.数据导入中用的很多,Create Table T_Person(Id int not NULL,Name nvarchar(50),Age int NULL).Drop Table T_Person1

sql xml 入门

/*sql xml 入门: 1.xml: 能认识元素.属性和值 2.xpath: 寻址语言,类似windows目录的查找(没用过dir命令的话就去面壁) 语法格式,这些语法可以组合为条件: "."表示自己,".."表示父亲,"/"表示儿子,"//"表示后代, "name"表示按名字查找,"@name"表示按属性查找 "集合[条件]" 表示根据条件取集合的子集,条件可以

1 小时 SQL 极速入门(三)——分析函数

转自:https://www.cnblogs.com/injet/p/10122832.html 前面两篇我们从 SQL 的最基础语法讲起,到表联结多表查询.大家可以点击链接查看1 小时 SQL 极速入门(一)1 小时 SQL 极速入门(二)今天我们讲一些在做报表和复杂计算时非常实用的分析函数.由于各个数据库函数的实现不太一样,本文基于 Oracle 12c . ROW_NUMBER()函数 这个函数在平时用的还是比较多的.这个函数的作用是为分组内的每一行返回一个行号.我们还是举例来说明.假设我

org.apache.calcite.sql.parser.impl.ParseException: Encountered &quot;create&quot;

在用calcite解析oracle的建表语句时报这样的错: Caused by: org.apache.calcite.sql.parser.impl.ParseException: Encountered "CREATE" at line 3, column 2. Was expecting one of: "SET" ... "RESET" ... "ALTER" ... "WITH" ... &quo