SQL解析工具JSQLParser
笔记哥 /
05-24 /
8点赞 /
0评论 /
885阅读
## 一、引言
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都是它的子类,例如以下用法:
```java
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_name` 或 `table.column`)。
3. 运算符
- `Addition`(`+`)、`Subtraction`(`-`)、`Multiplication`(`*`)、`Division`(`/`)等。
4. 函数调用
- `Function`(如 `COUNT(*)`、`SUBSTRING(str, 1, 2)`)。
5. 条件表达式
- `EqualsTo`(`=`)、`NotEqualsTo`(`<>` 或 `!=`)、`GreaterThan`(`>`)、`LikeExpression`(`LIKE`)等。
6. 逻辑表达式(BinaryExpression)
- `AndExpression`(`AND`)、`OrExpression`(`OR`)、`NotExpression`(`NOT`)。
7. 子查询
- `SubSelect`(如 `(SELECT ...)`)。
8. Case 表达式
- `CaseExpression`(`CASE WHEN ... THEN ... END`)。
9. 其他复杂表达式
- `CastExpression`(`CAST(... AS ...)`)、`IntervalExpression`(时间间隔)等。
### 2.4 Select
用于表示查询SQL语句,有三个常见子类:PlainSelect,ParenthesedSelect,SetOperationList
### 2.5 Update
用于表示更新的SQL语句
获得对应表
```java
Table table = update.getTable();
```
获得要更新的值
```java
List sets = update.getUpdateSets();
```
获取where条件
```java
Expression expression = update.getWhere()
```
### 2.6 Delete
用于表示删除的SQL语句
获得对应表
```java
Table table = delete.getTable();
```
获取where条件
```java
Expression expression = delete.getWhere()
```
### 2.7 Insert
用于表示添加SQL语句,有以下几种常见方法
获取添加的列
```java
List columns = insert.getColumns();
```
获取添加的值
```java
Values values = insert.getValues();
```
获取添加时冲突进行更新的结构
```sql
INSERT INTO ... VALUES ...ON DUPLICATE KEY UPDATE ...
```
```java
List duplicateUpdateColumns = insert.getDuplicateUpdateSets();
```
insert select的结构,获取select
```sql
INSERT ... SELECT ...
```
```java
Select select = insert.getSelect();
```
### 2.8 PlainSelect
用于表示最常规的那种查询结构,例如:
```sql
select...from...join...where...
```
获取select后面的结构
```java
List> selectItems = plainSelect.getSelectItems();
```
获取select语句的where结构
```java
Expression where = plainSelect.getWhere();
```
获取查询的from后的结构(表,子查询等)
```java
FromItem fromItem = plainSelect.getFromItem();
```
存在连接查询时,获取连接查询(left/right/inner)join后的结构
```java
List joins = plainSelect.getJoins();
```
### 2.9 SetOperationList
用于表示多个select语句通过`union`,`union all`连接在一起的联合查询SQL对象
```sql
select...from...
union all
select...from...
union all
select...from...
```
将语句拆分,获取构成它的若干select
```java
SetOperationList operationList = (SetOperationList) selectBody;
List
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/3645
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利
- 相关联分享
- SQL解析工具JSQLParser