文章目录

  • 前言
  • 本章节源码
  • 描述
  • 认识作者
  • 官方文档
  • 快速入门demo案例
    • 引入依赖
    • 获取到SQL的AST(抽象语法树)
    • 使用visitor完成表、字段、表达式解析
  • 汇总总结
  • 一、简介
    • 1.1、和Antlr生成Parser的区别
    • 1.2、Druid SQL Parser的使用场景
  • 二、各种语法支持
  • 三、性能
  • 四、Druid SQL Parser的代码结构
    • 4.1、parser
    • 4.2、AST
    • 4.3、Visitor
    • 4.4、自定义Visitor
    • 4.5、方言
  • 五、SchemaRepository
  • 参考文章
  • 资料获取

Druid学习笔记 02、快速使用Druid的SqlParser解析

前言

博主介绍:✌目前全网粉丝4W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。

博主所有博客文件目录索引:博客目录索引(持续更新)

CSDN搜索:长路

视频平台:b站-Coder长路

本章节源码

当前文档配套相关源码地址:

  • gitee:https://gitee.com/changluJava/demo-exer/tree/master/java-sqlparser/demo-druid/demo-druid-simpledemo
  • github:https://github.com/changluya/Java-Demos/tree/master/java-sqlparser/demo-druid/demo-druid/demo-druid-simpledemo

描述

Druid 本身并没有直接内置完善的血缘解析功能,但我们可以结合 Druid 的数据查询和元数据管理机制,配合一些外部手段实现基本的血缘解析。

认识作者

温绍锦:初心不改的阿里初代开源人:https://gitee.com/gitee-stars/18

官方文档

开源地址:https://github.com/alibaba/druid

学习文档:https://github.com/alibaba/druid/wiki/SQL-Parser

快速入门demo案例

引入依赖

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.0</version>
</dependency>

获取到SQL的AST(抽象语法树)

import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.parser.SQLParserUtils;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.util.JdbcConstants;public class Main {public static void main(String[] args) {String sql = "select id, name, age from user;";SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, JdbcConstants.HIVE);SQLStatement stmt= parser.parseStatementList().get(0);System.out.println(stmt);}
}

img

img

使用visitor完成表、字段、表达式解析

public static void main(String[] args) throws Exception{String sql = "select name, age from t_user left join t_user2 on t_user.id = t_user2.id  where t_user.id = 1;";List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, JdbcConstants.HIVE);SQLStatement stmt = stmtList.get(0);// 构建visitorSchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.HIVE);stmt.accept(statVisitor);System.out.println(statVisitor.getColumns()); // [t_user.name, t_user.age, t_user.id]System.out.println(statVisitor.getTables()); // {t_user=Select}System.out.println(statVisitor.getConditions()); // [t_user.id = 1]
}

img

汇总总结

下面内容主要参考Druid的学习wiki:https://github.com/alibaba/druid/wiki/SQL-Parser

一、简介

SQL Parser是Druid的一个重要组成部分,Druid内置使用SQL Parser来实现防御SQL注入(WallFilter)、合并统计没有参数化的SQL(StatFilter的mergeSql)、SQL格式化、分库分表。

1.1、和Antlr生成Parser的区别

和Antlr生成的SQL有很大不同的是,Druid SQL Parser性能非常好,可以用于生产环境直接对SQL进行分析处理。

1.2、Druid SQL Parser的使用场景

  • MySql SQL全量统计
  • Hive/ODPS SQL执行安全审计
  • 分库分表SQL解析引擎
  • 数据库引擎的SQL Parser

二、各种语法支持

Druid的sql parser是目前支持各种数据语法最完备的SQL Parser。目前对各种数据库的支持如下:

数据库DMLDDL
odps完全支持完全支持
mysql完全支持完全支持
postgresql完全支持完全支持
oracle支持大部分支持大部分
sql server支持常用的支持常用的ddl
db2支持常用的支持常用的ddl
hive支持常用的支持常用的ddl

druid还缺省支持sql-92标准的语法,所以也部分支持其他数据库的sql语法。

三、性能

Druid的SQL Parser是手工编写,性能非常好,目标就是在生产环境运行时使用的SQL Parser,性能比antlr、javacc之类工具生成的Parser快10倍甚至100倍以上。

SELECT ID, NAME, AGE FROM USER WHERE ID = ?

这样的SQL,druid parser处理大约是600纳秒,也就是说单线程每秒可以处理1500万次以上。在1.1.3~1.1.4版本中,SQL Parser的性能有极大提升,完全可以适用于生产环境中对SQL进行处理。

四、Druid SQL Parser的代码结构

Druid SQL Parser分三个模块:

  • Parser
  • AST
  • Visitor

4.1、parser

parser是将输入文本转换为ast(抽象语法树),parser有包括两个部分,Parser和Lexer,其中Lexer实现词法分析,Parser实现语法分析。

4.2、AST

AST是Abstract Syntax Tree的缩写,也就是抽象语法树。AST是parser输出的结果。下面是获得抽象语法树的一个例子:

final String dbType = JdbcConstants.MYSQL; // 可以是ORACLE、POSTGRESQL、SQLSERVER、ODPS等
String sql = "select * from t";
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
  • Druid SQL AST介绍 https://github.com/alibaba/druid/wiki/Druid_SQL_AST

4.3、Visitor

Visitor是遍历AST的手段,是处理AST最方便的模式,Visitor是一个接口,有缺省什么都没做的实现VistorAdapter。

我们可以实现不同的Visitor来满足不同的需求,Druid内置提供了如下Visitor:

  • OutputVisitor用来把AST输出为字符串
  • WallVisitor 来分析SQL语意来防御SQL注入攻击
  • ParameterizedOutputVisitor用来合并未参数化的SQL进行统计
  • EvalVisitor 用来对SQL表达式求值
  • ExportParameterVisitor用来提取SQL中的变量参数
  • SchemaStatVisitor 用来统计SQL中使用的表、字段、过滤条件、排序表达式、分组表达式
  • SQL格式化 Druid内置了基于语义的SQL格式化功能【字符串拼接模式完成sql格式化处理】

4.4、自定义Visitor

每种方言的Visitor都有一个缺省的VisitorAdapter,使得编写自定义的Visitor更方便。 https://github.com/alibaba/druid/wiki/SQL_Parser_Demo_visitor

4.5、方言

SQL-92、SQL-99等都是标准SQL,mysql/oracle/pg/sqlserver/odps等都是方言,也就是dialect。parser/ast/visitor都需要针对不同的方言进行特别处理

五、SchemaRepository

Druid SQL Parser内置了一个SchemaRepository,在内存中缓存SQL Schema信息,用于SQL语义解析中的ColumnResolve等操作。 https://github.com/alibaba/druid/wiki/SQL_Schema_Repository

可以基于Druid SQL Parser之上构造Oracle SQL到其他数据的SQL翻译。比如Aliyun提供的Oracle到MySql的SQL翻译功能,就是基于Druid基础上实现的。https://rainbow-expert.aliyun.com/sqltransform.htm


参考文章

[1]. Druid SQL解析原理以及使用(一):https://blog.csdn.net/qq_25104587/article/details/90577646

[2]. 使用Druid的sql parser做一个表数据血缘分析工具:https://www.cnblogs.com/enhe/p/12141686.html

资料获取

大家点赞、收藏、关注、评论啦~

精彩专栏推荐订阅:在下方专栏👇🏻

  • 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
  • 开源项目Studio-Vue—校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
  • 学习与生活-专栏:可以了解博主的学习历程
  • 算法专栏:算法收录

更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92254.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92254.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/92254.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间复杂度计算(以for循环为例)

本文理论内容来自严蔚敏版《数据结构(C语言版 第2版)》 *本文仅为复习时的总结&#xff0c;描述不准确、过程不严谨之处&#xff0c;还请理解 一、算法的相关概念 首先复习一下算法的定义及5个重要特性 其次是算法的评价标准 可以看到 时间复杂度 属于算法评价标准中的高效性…

图论(1):图数据结构

目录 一、图的定义 1.1 图的基本概念 1.2 图的分类 &#xff08;1&#xff09;按边的方向&#xff1a; &#xff08;2&#xff09;按边的权值&#xff1a; &#xff08;3&#xff09;按边的数量和类型&#xff1a; &#xff08;4&#xff09;按连通性&#xff1a; 1.3 图…

等保测评-Nginx中间件

Nginx *排查有无Nginx中间件&#xff0c;可使用以下命令&#xff1a; ps -ef | grep nginx、netstat -nutlp *确认Nginx中间件有运行&#xff0c;查看其目录&#xff1a; find / -name nginx.conf、ps -ef | grep Nginx *确认好目录后&#xff0c;查看版本&#xff1a; …

Milvus向量数据库版本升级

创建时间&#xff1a;2025-3-11 更新时间&#xff1a;2025-8-8 作者&#xff1a;薄刀刀、散装DBA 联系方式&#xff1a;bulkdba&#xff0c;1511777 背景&#xff1a;当前版本无法使用分组搜索功能&#xff0c;通过升级版本解决&#xff0c;计划将milvus升级到2.4.15&#xf…

若依前后端分离版学习笔记(六)——JWT

在上一节已经提到了传统Session认证和JWT认证内容&#xff0c;这一节对JWT进行更加详细的了解。 一 JWT介绍 1、传统的session认证 1.1 传统session认证流程 1.用户向服务器发送用户名和密码 2.服务器通过验证后&#xff0c;在当前对话&#xff08;session&#xff09;中保存相…

如何永久删除三星手机中的照片?

如果你计划出售你的三星 Galaxy 手机&#xff0c;或者整理其接近满容量的存储空间&#xff0c;你可能会担心如何从设备中移除照片和其他文件。这对于确保你的个人信息保持安全至关重要&#xff0c;即使你选择通过各种平台捐赠或出售旧手机也是如此。在本文中&#xff0c;我们介…

【数字图像处理系列笔记】Ch06:图像压缩

一、基础知识信源编码器&#xff1a;减少或消除输入图像中的编码冗余、像素 间冗余以及心理视觉冗余。 数据的冗余 一、空间冗余&#xff08;Spatial Redundancy&#xff09;1. 定义图像中相邻像素间的强相关性导致的冗余 —— 同一区域内相邻像素的像素值&#xff08;如灰度、…

windows线程基础

Windows线程机制详解 线程的基本概念 在Windows操作系统中&#xff0c;线程是程序执行的最小单位。每个进程至少包含一个线程&#xff08;主线程&#xff09;&#xff0c;但可以创建多个线程来并行执行任务。线程与进程的主要区别在于&#xff1a; 资源分配&#xff1a;进程拥有…

Numpy科学计算与数据分析:Numpy随机数生成入门

Numpy随机数生成实战 学习目标 通过本课程&#xff0c;学员将掌握如何使用Numpy库生成不同类型的随机数&#xff0c;包括随机整数、随机浮点数以及从特定分布中抽样的方法。本课程将通过理论讲解与实践操作相结合的方式&#xff0c;帮助学员深入理解Numpy在随机数生成方面的强…

使用 C# 通过 .NET 框架开发应用程序的安装与环境配置

文章目录1. .NET介绍2. IDE2.1 Rider 安装2.2 Visual Studio 安装3. SDK安装与环境配置3.1 单独下载安装 .NET SDK3.2 Visual Studio 工作负荷安装SDK4. 相关问题4.1 我以前使用 Unity 写 C# 脚本不需要额外的编译器&#xff0c;为什么现在需要&#xff1f;1. .NET介绍 .NET 是…

Scikit-learn - 机器学习库初步了解

目录1. 主要算法分类1.1 监督学习 (Supervised Learning)1.2 非监督学习 (Unsupervised Learning)1.3 半监督学习 (Semi-Supervised Learning)1.4 强化学习 (Reinforcement Learning)1.5 遗传算法 (Genetic Algorithm)2. 选择合适的机器学习模型2.1 分类 (Classification)2.2 回…

关于 idea 里 properties 文件的中文乱码问题

背景 你会发现 properties 文件里的中文可能会出现乱码。 这个因为 properties 规范是使用 iso-8859-1 存储的&#xff0c;不支持中文&#xff08;也不支持西欧里法语、德语里奇怪的字母&#xff09; properties 的标准制定于很早&#xff0c;所以没考虑这么多&#xff0c;prop…

BVH文件 解析 解读的python第三方类库 推荐

我们面临多个第三方库选项用于解析BVH文件&#xff0c;根据您的列表&#xff0c;我将分析几个关键库的特点&#xff0c;并推荐最适合当前任务的库。我们将基于以下标准进行选择&#xff1a; ​​功能性​​&#xff1a;是否能准确解析关节角度数据&#xff0c;支持关键帧操作 ​…

uni-app X能成为下一个Flutter吗?

哈喽&#xff0c;我是老刘 老刘使用Flutter作为客户端主要技术栈的这六七年的时间里&#xff0c;关于跨平台开发的争议和新技术始终没有停过。 “一套代码&#xff0c;多端运行”——这个让无数开发者心动的承诺&#xff0c;究竟是技术革命还是美丽的谎言&#xff1f; 想象一…

Spring Cloud Gateway全栈实践:动态路由能力与WebFlux深度整合

一、为什么需要下一代网关&#xff1f; 传统网关的三大瓶颈&#xff1a; #mermaid-svg-Kdei9Io6KntYGQc4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Kdei9Io6KntYGQc4 .error-icon{fill:#552222;}#mermaid-svg-…

MongoDB数据存储界的瑞士军刀:cpolar内网穿透实验室第513号挑战

软件名称&#xff1a;MongoDB 操作系统支持&#xff1a;Linux、Windows、macOS&#xff08;Docker版全平台通用&#xff01;&#xff09; 软件介绍&#xff1a; MongoDB是一个基于分布式架构的NoSQL数据库&#xff0c;擅长处理复杂数据类型&#xff08;如嵌套对象、数组&…

SPI TFT全彩屏幕驱动开发及调试

简介SPI&#xff08;Serial Peripheral Interface&#xff09;是一种广泛使用的串行通信协议&#xff0c;常用于微控制器&#xff08;MCU&#xff09;与外围设备&#xff08;如传感器、显示屏、存储器等&#xff09;之间的通信。SPI具有全双工传输、主从结构和较高的传输速率&a…

Linux学习—数据结构(链表2)

1.单向链表6.链表的查找在链表中找到指定的第一个元素沿用遍历思想&#xff0c;每次访问一个节点元素判断是否为要找的节点符合条件返回该节点地址到最后没有找到符号条件的节NULLlinknode *find_linklist(linknode *phead, datatype tmpdata) {linknode *ptmpnode NULL;ptmpn…

MySQL 备份利器 Xtrabackup 全解析:从部署到恢复的实战指南

数据库备份恢复是 DBA 的 “保命” 技能&#xff0c;生产业务不仅要保证有合适的备份策略&#xff0c;也要定期验证备份的有效性和恢复演练流程&#xff0c;因为数据恢复和验证可能会涉及多方合作&#xff0c;演练可以让灾难真正发生时&#xff0c;多方配合有条不紊的将数据恢复…

EAGLE-2:通过动态草稿树加速语言模型推理

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" EAGLE-2&#xff1a;通过动态草稿树加速语言模型推理 摘要 现代 Large Language Models&#xff08;LLMs&#xff09;的推理过程既昂贵又耗时&#xff0c;而 speculative sampling 已被证明是一种有效的解决方案…