本文主要基于 Sharding-JDBC 1.5.0 正式版
1. 概述
2. UpdateStatement
3. #parse()
3.1 #skipBetweenUpdateAndTable()
3.2 #parseSingleTable()
3.3 #parseSetItems()
3.4 #parseWhere()
RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
您对于源码的疑问每条留言都将得到认真回复. 甚至不知道如何读源码也可以请教噢.
新的源码解析文章实时收到通知. 每周更新一篇左右.
认真的源码交流微信群.
1. 概述
本文前置阅读:
《SQL 解析 (一) 之词法解析》
《SQL 解析 (二) 之 SQL 解析》
本文分享更新 SQL 解析的源码实现.
更新 SQL 解析比查询 SQL 解析复杂度低的多的多. 不同数据库在插入 SQL 语法上也统一的多. 本文分享 MySQL 更新 SQL 解析器 MySQLUpdateParser.
MySQL UPDATE 语法一共有 2 种 :
第一种: Single-table syntax
UPDATE[LOW_PRIORITY][IGNORE] table_reference SET col_name1 = {
expr1 | DEFAULT
} [, col_name2 = {
expr2 | DEFAULT
}]... [WHERE where_condition][ORDER BY...][LIMIT row_count]
第二种: Multiple-table syntax
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
Sharding-JDBC 目前仅支持第一种. 业务场景上使用第二种的很少很少.
Sharding-JDBC 更新 SQL 解析主流程如下:
// AbstractUpdateParser.java
@Override public UpdateStatement parse() {
sqlParser.getLexer().nextToken(); // 跳过 UPDATE
skipBetweenUpdateAndTable(); // 跳过关键字, 例如: MYSQL 里的 LOW_PRIORITY,IGNORE
sqlParser.parseSingleTable(updateStatement); // 解析表
parseSetItems(); // 解析 SET
sqlParser.skipUntil(DefaultKeyword.WHERE);
sqlParser.setParametersIndex(parametersIndex);
sqlParser.parseWhere(updateStatement);
return updateStatement; // 解析 WHERE
}
Sharding-JDBC 正在收集使用公司名单: 传送门 .
来源: https://juejin.im/entry/5a738ef15188257a624c97eb