Druid學習筆記 02、快速使用Druid的SqlParser解析

文章目錄

  • 前言
  • 本章節源碼
  • 描述
  • 認識作者
  • 官方文檔
  • 快速入門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 已被證明是一種有效的解決方案…