SQL解析工具JSQLParser

目錄

    • 一、引言
    • 二、JSQLParser常見類
      • 2.1 Class Diagram
      • 2.2 Statement
      • 2.3 Expression
      • 2.4 Select
      • 2.5 Update
      • 2.6 Delete
      • 2.7 Insert
      • 2.8 PlainSelect
      • 2.9 SetOperationList
      • 2.10 ParenthesedSelect
      • 2.11 FromItem
      • 2.12 Table
      • 2.13 ParenthesedFromItem
      • 2.14 SelectItem
      • 2.15 BinaryExpression
      • 2.16 InExpression
      • 2.17 ExistsExpression
      • 2.18 NotExpression
      • 2.19 Parenthesis
      • 2.20 Function
      • 2.21 EqualsTo
      • 2.22 OrExpression
      • 2.23 AndExpression
      • 2.24 Join
      • 2.25 Column
      • 2.26 UpdateSet
      • 2.27 ExpressionList
      • 2.28 ParenthesedExpressionList
    • 附:類路徑

一、引言

JSQLParser(GitHub:https://github.com/JSQLParser/JSqlParser)是一個Java語言的SQL語句解析工具,功能十分強大,它可以將SQL語句解析成為Java類的層次結構,還支持改寫SQL,常見的持久層框架MyBatis-Plus就采用它作為SQL解析工具來實現某些功能。

二、JSQLParser常見類

2.1 Class Diagram

在這里插入圖片描述

2.2 Statement

可以理解為能夠表示任意一種SQL語句的對象,Select、Update、Delete、Insert都是它的子類,例如以下用法:

Statement statement = JsqlParserGlobal.parse(sql);if (statement instanceof Insert) {this.processInsert((Insert) statement, index, sql, obj);
} else if (statement instanceof Select) {this.processSelect((Select) statement, index, sql, obj);
} else if (statement instanceof Update) {this.processUpdate((Update) statement, index, sql, obj);
} else if (statement instanceof Delete) {this.processDelete((Delete) statement, index, sql, obj);
}

2.3 Expression

是JSqlParser庫中的一個核心接口,是用于表示SQL語句中的各種表達式的基類接口,通過調用對象的.toString()方法,就能看到具體的語句結構。

例如:

  1. 基本值
    • LongValue(整數值)、StringValue(字符串值)、DoubleValue(浮點數值)等。
  2. 列引用
    • Column(表示列名,如 column_nametable.column)。
  3. 運算符
    • Addition+)、Subtraction-)、Multiplication*)、Division/)等。
  4. 函數調用
    • Function(如 COUNT(*)SUBSTRING(str, 1, 2))。
  5. 條件表達式
    • EqualsTo=)、NotEqualsTo<>!=)、GreaterThan>)、LikeExpressionLIKE)等。
  6. 邏輯表達式(BinaryExpression)
    • AndExpressionAND)、OrExpressionOR)、NotExpressionNOT)。
  7. 子查詢
    • SubSelect(如 (SELECT ...))。
  8. Case 表達式
    • CaseExpressionCASE WHEN ... THEN ... END)。
  9. 其他復雜表達式
    • CastExpressionCAST(... AS ...))、IntervalExpression(時間間隔)等。

2.4 Select

用于表示查詢SQL語句,有三個常見子類:PlainSelect,ParenthesedSelect,SetOperationList

2.5 Update

用于表示更新的SQL語句

獲得對應表

Table table = update.getTable();

獲得要更新的值

List<UpdateSet> sets = update.getUpdateSets();

獲取where條件

Expression expression = update.getWhere()

2.6 Delete

用于表示刪除的SQL語句

獲得對應表

Table table = delete.getTable();

獲取where條件

Expression expression = delete.getWhere()

2.7 Insert

用于表示添加SQL語句,有以下幾種常見方法

獲取添加的列

List<Column> columns = insert.getColumns();

獲取添加的值

Values values = insert.getValues();

獲取添加時沖突進行更新的結構

INSERT INTO ... VALUES ...ON DUPLICATE KEY UPDATE ...
List<UpdateSet> duplicateUpdateColumns = insert.getDuplicateUpdateSets();

insert select的結構,獲取select

INSERT ... SELECT ...
Select select = insert.getSelect();

2.8 PlainSelect

用于表示最常規的那種查詢結構,例如:

select...from...join...where...

獲取select后面的結構

List<SelectItem<?>> selectItems = plainSelect.getSelectItems();

獲取select語句的where結構

Expression where = plainSelect.getWhere();

獲取查詢的from后的結構(表,子查詢等)

FromItem fromItem = plainSelect.getFromItem();

存在連接查詢時,獲取連接查詢(left/right/inner)join后的結構

List<Join> joins = plainSelect.getJoins();

2.9 SetOperationList

用于表示多個select語句通過unionunion all連接在一起的聯合查詢SQL對象

select...from...
union all
select...from...
union all
select...from...

將語句拆分,獲取構成它的若干select

SetOperationList operationList = (SetOperationList) selectBody;
List<Select> selectBodyList = operationList.getSelects();

2.10 ParenthesedSelect

用于表示子查詢,被小括號包裹的一個查詢結構,例如:

(select....from...) as t

“去括號”,得到一個PlainSelect

ParenthesedSelect parenthesedSelect = (ParenthesedSelect) selectBody;
Select select = parenthesedSelect.getSelect();

2.11 FromItem

接口,from后面的SQL結構,ParenthesedSelect,ParenthesedFromItem,Table都是它的實現

FromItem fromItem = plainSelect.getFromItem();if (fromItem instanceof Table) {}
else if (fromItem instanceof ParenthesedSelect) {}
else if (fromItem instanceof ParenthesedFromItem) {}

2.12 Table

用于表示SQL中的表

2.13 ParenthesedFromItem

小括號包裹的可被查詢的結構,但不是子查詢,不常用,例如小括號包裹的join:

(tab1 join tab2)

2.14 SelectItem

用于表示select語句中,select和from之間的部分,例如:

selectfun(1, 2) as a,(select x from ...) as b,name as c,exists (...) AS d
from t
List<SelectItem<?>> selectItems = plainSelect.getSelectItems();selectItems.forEach(selectItem -> {Expression expression = selectItem.getExpression();if (expression instanceof Select) {}else if (expression instanceof Function) {}else if (expression instanceof ExistsExpression) {}
});

2.15 BinaryExpression

泛指比較符號:and or = >= =<,這種結構左右連接著其他結構。EqualsTo,OrExpression,AndExpression都是它的子類。

獲取左右兩側的結構:

BinaryExpression expression = (BinaryExpression) obj;
Expression left = expression.getLeftExpression();
Expression right = expression.getRightExpression();

2.16 InExpression

x in (...)

獲取右側的結構,可能是子查詢或(*,*,*...)

InExpression expression = (InExpression) obk;
Expression inExpression = expression.getRightExpression();

2.17 ExistsExpression

exists (...)

獲取右側結構

ExistsExpression expression = (ExistsExpression) obj;
Expression e = expression.getRightExpression() ;

2.18 NotExpression

not,與其他的配合使用,例如:

not in (...)not exists (...)

獲取not后面的結構,會提取出in exists等結構

NotExpression expression = (NotExpression) obj;
Expression e = expression.getExpression();

2.19 Parenthesis

代表小括號()括起來的結構

(...)

去括號,拿到括號中的結構:

Parenthesis expression = (Parenthesis) obj;
Expression e = expression.getExpression();

2.20 Function

函數結構,通常會獲取參數,對參數進行操作

fun()
ExpressionList<?> parameters = function.getParameters();
if (parameters != null) {parameters.forEach(expression -> {if (expression instanceof Select) {} else if (expression instanceof Function) {} });
}

2.21 EqualsTo

=

2.22 OrExpression

or

2.23 AndExpression

and

2.24 Join

SQL中連接查詢的join結構,從Select中獲得。

獲取join后的結構,一般可能是表也可能是子查詢

FromItem joinItem = join.getRightItem();

判斷是否為隱式內連接

join.isSimple();

判斷是內/左/右連接

join.isRight();
join.isInner();
join.isLeft();

獲取join的on條件

Collection<Expression> originOnExpressions = join.getOnExpressions();

改寫join的on條件

join.setOnExpressions(onExpressions);

2.25 Column

用于表示SQL中的字段對象,例如從一個Insert對象獲取SQL要添加的全部字段:name,age,tenant_id

INSERT INTO t_user (name, age, tenant_id) VALUES ('liming', 15), ('zhaoying', 16)
List<Column> columns = insert.getColumns();

2.26 UpdateSet

UpdateSet是一種類似xx = xx, ...的結構,出現在update的set后面

update user set username = 5 where id = 1 
List<UpdateSet> sets = update.getUpdateSets();

也能在insert語句處理添加的數據沖突的情況時,出現在ON DUPLICATE KEY UPDATE后面

INSERT INTO table_name (col1, col2) VALUES (val1, val2)
ON DUPLICATE KEY UPDATE col1 = val3, col2 = col4 + 1;
List<UpdateSet> duplicateUpdateColumns = insert.getDuplicateUpdateSets();

2.27 ExpressionList

Expression列表,本質上是List<Expression>,當insert語句values后面批量跟了多組值,就能得到這種結構。

('liming', 15), ('zhaoying', 16)
Values values = insert.getValues();
ExpressionList<Expression> expressions = (ExpressionList<Expression>) values.getExpressions();

2.28 ParenthesedExpressionList

繼承自ExpressionList,本質上也是List<Expression>,一種帶著括號的Expression結構,例如獲取insert語句values后面的值就能得到這種結構

('liming', 15)
Values values = insert.getValues();
ExpressionList<Expression> expressions = (ExpressionList<Expression>) values.getExpressions();
if (expressions instanceof ParenthesedExpressionList) {// ParenthesedExpressionList
} else {// ExpressionList
}

原文首發:https://blog.liuzijian.com/post/jsqlparser.html

附:類路徑

net.sf.jsqlparser.statement.Statement
net.sf.jsqlparser.statement.select.Select
net.sf.jsqlparser.statement.update.Update
net.sf.jsqlparser.statement.delete.Delete
net.sf.jsqlparser.statement.insert.Insert
net.sf.jsqlparser.schema.Table
net.sf.jsqlparser.expression.Expression
net.sf.jsqlparser.statement.select.ParenthesedSelect
net.sf.jsqlparser.statement.select.SetOperationList
net.sf.jsqlparser.statement.select.SelectItem
net.sf.jsqlparser.expression.BinaryExpression
net.sf.jsqlparser.expression.operators.relational.InExpression
net.sf.jsqlparser.expression.operators.relational.ExistsExpression
net.sf.jsqlparser.expression.NotExpression
net.sf.jsqlparser.expression.Parenthesis
net.sf.jsqlparser.statement.select.ParenthesedFromItem
net.sf.jsqlparser.statement.select.FromItem
net.sf.jsqlparser.expression.Function
net.sf.jsqlparser.expression.operators.relational.EqualsTo
net.sf.jsqlparser.expression.operators.conditional.OrExpression
net.sf.jsqlparser.expression.operators.conditional.AndExpression
net.sf.jsqlparser.statement.select.Join
net.sf.jsqlparser.schema.Column
net.sf.jsqlparser.expression.operators.relational.ExpressionList
net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906689.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906689.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906689.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安裝完dockers后就無法聯網了,執行sudo nmcli con up Company-WiFi,一直在加載中

Docker服務狀態檢查 執行 systemctl status docker 確認服務是否正常 若未運行&#xff0c;使用 sudo systemctl start docker && sudo systemctl enable docker 網絡配置沖突 Docker會創建docker0虛擬網橋&#xff0c;可能與宿主機網絡沖突 檢查路由表 ip route sho…

Docker 運維管理

Docker 運維管理 一、Swarm集群管理1.1 Swarm的核心概念1.1.1 集群1.1.2 節點1.1.3 服務和任務1.1.4 負載均衡 1.2 Swarm安裝準備工作創建集群添加工作節點到集群發布服務到集群擴展一個或多個服務從集群中刪除服務ssh免密登錄 二、Docker Compose與 Swarm 一起使用 Compose 三…

軟媒魔方——一款集合多種系統輔助組件的軟件

停更4年&#xff0c;但依舊吊炸天&#xff01; 親們&#xff0c;是不是覺得電腦用久了就像老牛拉車&#xff0c;慢得讓人著急&#xff1f;別急&#xff0c;我今天要給大家安利一個超好用的電腦優化神器——軟媒魔方&#xff01; 軟件介紹 首先&#xff0c;這貨真心是免費的&a…

upload-labs通關筆記-第19關文件上傳之條件競爭

目錄 一、條件競爭 二、源碼分析 1、源碼分析 2、攻擊原理 3、滲透思路 三、實戰滲透 1、構造腳本 2、制作圖片馬 3、獲取上傳腳本URL 4、構造訪問母狼腳本的Python代碼 5、bp不斷并發上傳母狼圖片馬 &#xff08;1&#xff09;開啟專業版bp &#xff08;2&#xf…

分布式消息隊列kafka詳解

分布式消息隊列kafka詳解 引言 Apache Kafka是一個開源的分布式事件流平臺&#xff0c;最初由LinkedIn開發&#xff0c;現已成為處理高吞吐量、實時數據流的行業標準。Kafka不僅僅是一個消息隊列&#xff0c;更是一個完整的分布式流處理平臺&#xff0c;能夠發布、訂閱、存儲…

uni-app(3):互相引用

1 絕對路徑和相對路徑 在日常開發中&#xff0c;經常會遇到使用絕對路徑還是相對路徑的問題&#xff0c;下面我們介紹下這兩種路徑。 1.1 絕對路徑 絕對路徑&#xff1a;是指從項目根目錄開始的完整路徑。它用于指定文件或目錄的確切位置。絕對路徑通常以斜杠&#xff08;/&am…

python與flask框架

一、理論 Flask是一個輕量級的web框架&#xff0c;靈活易用。提供構建web應用所需的核心工具。 Flask依賴python的兩個庫 Werkzeug&#xff1a;flask的底層庫&#xff0c;提供了WSGI接口、HTTP請求和響應處理、路由等核心功能。 Jinja2&#xff1a;模板引擎&#xff0…

esp32-idf框架學習筆記/教程

esp32型號: 環境搭建 安裝:就按這個來,別的試了好多次都不行,這個一次成功!!!! vscode下ESP32開發環境配置&#xff08;100%成功&#xff09;_嗶哩嗶哩_bilibili esp芯片的兩種模式: ESP32 固件燒錄教程_嗶哩嗶哩_bilibili 1.運行模式 2.下載模式 esp32s3程序下載 1.數據…

VKontakte(VK)注冊教程

VKontakte&#xff08;簡稱VK&#xff09;是俄羅斯最大的社交網絡平臺&#xff0c;類似于Facebook&#xff0c;用戶可以通過它進行社交、分享圖片、視頻、音樂等內容&#xff0c;并參與各類社群討論&#xff0c;是與俄羅斯及其他東歐地區的朋友建立聯系的便捷平臺。對于做俄羅斯…

STM32+ESP8266+ONENET+微信小程序上傳數據下發指令避坑指南

之前只做過類似的但是以為這種爛大街的功能應該不難結果還是踩了不少坑&#xff0c;記錄幾個需要注意的點 首先貼一個非常有用的視頻&#xff0c;里面講的很詳細&#xff0c;給的資料也很全【【新版OneNet云平臺】STM32ESP8266上傳數據&#xff0c;簡單易上手&#xff01;】 h…

【知識點】關于vue3中markRow、shallowRef、shallowReactive的了解

首先我們先了解一下這三個函數的定義以及區別 markRow 定義&#xff1a; 一個用于標記對象為非響應式的工具函數 shallowRef 定義&#xff1a; 一個用于創建淺層響應式引用的函數&#xff0c;只對 .value 本身進行響應式處理&#xff0c;不會遞歸地將 .value 指向的對象或…

后端開發實習生-抖音生活服務

職位描述 ByteIntern&#xff1a;面向2026屆畢業生&#xff08;2025年9月-2026年8月期間畢業&#xff09;&#xff0c;為符合崗位要求的同學提供轉正機會。 團隊介紹&#xff1a;生活服務業務依托于抖音、抖音極速版等平臺&#xff0c;致力于促進用戶與本地服務的連接。過去一…

OceanBase 共享存儲:云原生數據庫的存儲

目錄 探會——第三屆 OceanBase 開發者大會 重磅發布&#xff1a;OceanBase 4.3 開發者生態全面升級 實戰演講&#xff1a;用戶案例與行業落地 OceanBase 共享存儲架構解析 什么是共享存儲架構&#xff1f; 云原生數據庫的架構 性能、彈性與多云的統一 為何OceanBase能…

C++ 結構體封裝模式與 Promise 鏈式調用:設計思想的異曲同工

C 結構體封裝模式與 Promise 鏈式調用&#xff1a;設計思想的異曲同工 在軟件開發中&#xff0c;我們常常追求代碼的可維護性、可擴展性和可讀性。不同的編程語言和場景下&#xff0c;雖然實現方式各異&#xff0c;但背后的設計思想往往存在著奇妙的相似性。本文將探討 C 中結…

【Go】1、Go語言基礎

前言 本系列文章參考自稀土掘金上的 【字節內部課】公開課&#xff0c;做自我學習總結整理。 Go語言的特點 Go語言由Google團隊設計&#xff0c;以簡潔、高效、并發友好為核心目標。 具有以下優點&#xff1a; 語法簡單、學習曲線平緩&#xff1a;語法關鍵字很少&#xff0c;且…

AI時代的新營銷范式:生成式引擎優化(GEO)的崛起——品牌如何被大模型收錄

在數字化浪潮席卷全球的今天&#xff0c;我們正站在一個前所未有的歷史拐點。如果說過去二十年&#xff0c;搜索引擎優化&#xff08;SEO&#xff09;重塑了企業與消費者的連接方式&#xff0c;那么未來二十年&#xff0c;生成式引擎優化&#xff08;GEO&#xff09;將徹底顛覆…

實用藍牙耳機哪款好?先做好使用場景分析!

市面上的藍牙耳機款式繁多&#xff0c;618到來之際&#xff0c;消費者如何選擇適合自己的藍牙耳機&#xff1f;實用藍牙耳機哪款好&#xff1f;關鍵在于做好使用場景分析&#xff01;今天&#xff0c;就帶大家結合不同的使用場景&#xff0c;分享三款倍思音頻的精品藍牙耳機。 …

PTA刷題筆記3(微難,有詳解)

7-15 計算圓周率 代碼如下&#xff1a; #include <stdio.h>int main() {double threshold;scanf("%lf", &threshold);double pi_over_2 1.0; // π/2的初始值&#xff08;第一項1&#xff09;double term 1.0; // 當前項的值int n 1; …

基于SpringBoot+Vue的社區醫院信息平臺設計與實現

項目背景與概述 隨著醫療健康信息化的發展&#xff0c;社區醫院的管理逐漸由傳統的手工模式轉向信息化管理。為了提高醫院的管理效率、減少人工操作、提升服務質量&#xff0c;開發一個高效且實用的社區醫院信息平臺顯得尤為重要。本系統基于Spring Boot框架與MySQL數據庫設計…

舊物回收小程序:讓閑置煥發光彩,為生活增添價值

你是否常常為家中堆積如山的閑置物品而煩惱&#xff1f;那些曾經心愛的物品&#xff0c;如今卻成了占據空間的“雞肋”&#xff0c;丟棄可惜&#xff0c;留著又無處安放。別擔心&#xff0c;一款舊物二手回收小程序將為你解決這一難題&#xff0c;讓閑置物品重新煥發光彩&#…