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 ![image](https://cdn.res.knowhub.vip/c/2505/25/fc480581.png?G1YAAER17rxgpWMofice0wSBBJsBiSyCSgnr9fz%2f2pfI%2bznBHO%2fR%2bvT94S%2btTxe1A4QKQYMheCrJqiXlGkouJxSW4hoO) ### 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