⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Sharding-JDBC/sql-parse-6/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 Sharding-JDBC 1.5.0 正式版


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1. 概述

本文前置阅读:

本文分享删除SQL解析的源码实现。

🙂 如果你已经理解《SQL 解析(三)之查询SQL》,那本文会是一篇水文,当成一种放松吧。还是跟前文一样,以 MySQL 举例子。我们来一起看看 MySQLDeleteParser。

MySQL DELETE 语法一共有 2 种 :

  • 第一种:Single-table syntax

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[PARTITION (partition_name,...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

  • 第二种:Multiple-table syntax

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*]] ...
FROM table_references
[WHERE where_condition]

OR

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*]] ...
USING table_references
[WHERE where_condition]

Sharding-JDBC 目前仅支持第一种。业务场景上使用第二种的很少很少。

Sharding-JDBC 更新SQL解析主流程如下:

// AbstractDeleteParser.java
@Override
public DeleteStatement parse() {
sqlParser.getLexer().nextToken(); // 跳过 DELETE
skipBetweenDeleteAndTable(); // // 跳过关键字,例如:MYSQL 里的 LOW_PRIORITY、IGNORE 和 FROM
sqlParser.parseSingleTable(deleteStatement); // 解析表
sqlParser.skipUntil(DefaultKeyword.WHERE); // 跳到 WHERE
sqlParser.parseWhere(deleteStatement); // 解析 WHERE
return deleteStatement;
}

Sharding-JDBC 正在收集使用公司名单:传送门
🙂 你的登记,会让更多人参与和使用 Sharding-JDBC。传送门
Sharding-JDBC 也会因此,能够覆盖更多的业务场景。传送门
登记吧,骚年!传送门

2. DeleteStatement

删除SQL 解析结果。

public final class UpdateStatement extends AbstractSQLStatement {
}

😈 对,没有其他属性。

我们来看下 DELETE IGNORE FROM t_user WHERE user_id = ?解析结果

3. #parse()

3.1 #skipBetweenDeleteAndTable()

DELETE 和 表名 之间有些词法,对 SQL 路由和改写无影响,进行跳过。

// MySQLDeleteParser.java
@Override
protected void skipBetweenDeleteAndTable() {
getSqlParser().skipAll(MySQLKeyword.LOW_PRIORITY, MySQLKeyword.QUICK, MySQLKeyword.IGNORE);
getSqlParser().skipIfEqual(DefaultKeyword.FROM);
}

// OracleDeleteParser.java
@Override
protected void skipBetweenDeleteAndTable() {
getSqlParser().skipIfEqual(DefaultKeyword.FROM);
getSqlParser().skipIfEqual(OracleKeyword.ONLY);
}

3.2 #parseSingleTable()

解析,请看《SQL 解析(二)之SQL解析》的 #parseSingleTable() 小节

3.3 #parseWhere()

解析 WHERE 条件。解析代码:《SQL 解析(二)之SQL解析》的#parseWhere()小节

666. 彩蛋

知识星球

道友,帮我分享一波怎么样?

后面 SQL 路由和改写会更加有趣哟!

文章目录
  1. 1. 1. 概述
  2. 2. 2. DeleteStatement
  3. 3. 3. #parse()
    1. 3.1. 3.1 #skipBetweenDeleteAndTable()
    2. 3.2. 3.2 #parseSingleTable()
    3. 3.3. 3.3 #parseWhere()
  4. 4. 666. 彩蛋