本文主要基于 Sharding-JDBC 1.5.0 正式版
1. 概述
2. InsertStatement
3. #parse()
3.1 #parseInfo()
3.2 #parseColumns()
3.3 #parseValues()
3.4 #parseCustomizedInsert()
3.5 #appendGenerateKey()
RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
您对于源码的疑问每条留言都将得到认真回复.甚至不知道如何读源码也可以请教噢.
新的源码解析文章实时收到通知.每周更新一篇左右.
认真的源码交流微信群.
1. 概述
本文前置阅读:
《SQL 解析(一)之词法解析》
《SQL 解析(二)之 SQL 解析》
本文分享插入 SQL 解析的源码实现.
不考虑 INSERT SELECT 情况下,插入 SQL 解析比查询 SQL 解析复杂度低的多的多.不同数据库在插入 SQL 语法上也统一的多.本文分享 MySQL 插入 SQL 解析器 MySQLInsertParser.
MySQL INSERT 语法一共有 3 种 :
第一种:
INSERT {VALUES | VALUES}
INSERT[LOW_PRIORITY | DELAYED | HIGH_PRIORITY][IGNORE][INTO] tbl_name[PARTITION(partition_name, ...)][(col_name, ...)] {
VALUES | VALUE
} ({
expr | DEFAULT
},
...),
(...),
... [ON DUPLICATE KEY UPDATE col_name = expr[, col_name = expr]...]
第二种:INSERT SET
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name,...)]
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
第三种:INSERT SELECT
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name,...)]
[(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
Sharding-JDBC 目前支持:
第一种:
INSERT {VALUES | VALUES}
单条记录
第二种:INSERT SET
Sharding-JDBC 插入 SQL 解析主流程如下:
// AbstractInsertParser.java
public final InsertStatement parse() {
sqlParser.getLexer().nextToken(); // 跳过 INSERT 关键字
parseInto(); // 解析INTO
parseColumns(); // 解析表
if (sqlParser.equalAny(DefaultKeyword.SELECT, Symbol.LEFT_PAREN)) {
throw new UnsupportedOperationException("Cannot support subquery");
}
if (getValuesKeywords().contains(sqlParser.getLexer().getCurrentToken().getType())) { // 第一种插入SQL情况
parseValues();
} else if (getCustomizedInsertKeywords().contains(sqlParser.getLexer().getCurrentToken().getType())) { // 第二种插入SQL情况
parseCustomizedInsert();
}
appendGenerateKey(); // 自增主键
return insertStatement;
}
Sharding-JDBC 正在收集使用公司名单: 传送门 .
来源: https://juejin.im/entry/5a63bc816fb9a01c9f5b8398