一、引言
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()方法,就能看到具体的语句结构。
例如:
- 基本值
- LongValue(整数值)、StringValue(字符串值)、DoubleValue(浮点数值)等。
- 列引用
- Column(表示列名,如 column_name 或 table.column)。
- 运算符
- Addition(+)、Subtraction(-)、Multiplication(*)、Division(/)等。
- 函数调用
- Function(如 COUNT(*)、SUBSTRING(str, 1, 2))。
- 条件表达式
- EqualsTo(=)、NotEqualsTo( 或 !=)、GreaterThan(>)、LikeExpression(LIKE)等。
- 逻辑表达式(BinaryExpression)
- AndExpression(AND)、OrExpression(OR)、NotExpression(NOT)。
- 子查询
- SubSelect(如 (SELECT ...))。
- Case 表达式
- CaseExpression(CASE WHEN ... THEN ... END)。
- 其他复杂表达式
- CastExpression(CAST(... 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- Select select = insert.getSelect();
复制代码 2.8 PlainSelect
用于表示最常规的那种查询结构,例如:- select...from...join...where...
复制代码 获取select后面的结构- List<SelectItem<?>> selectItems = plainSelect.getSelectItems();
复制代码 2.15 BinaryExpression
泛指比较符号:and or = >= = |