一,SQL解析之创建SQL解析引擎
SQL路由的前题是需要先解析SQL,那么接上一篇博文继续看分片-JDBC是如何进行SQL解析的,也就是看ParsingSQLRouter中是如何实现Sql解析的(关注红色字体),且看源码。
io.shardingjdbc.core.routing.router.ParsingSQLRouter中代码片段
//ParsingSQLRouter构造器
public ParsingSQLRouter(final ShardingContext shardingContext) {
shardingRule = shardingContext.getShardingRule(); --分片规则
databaseType = shardingContext.getDatabaseType(); --数据库类型
showSQL = shardingContext.isShowSQL();
generatedKeys = new LinkedList<>();
}
@Override
public SQLStatement parse(final String logicSQL, final int parametersSize) {
SQLParsingEngine parsingEngine = new SQLParsingEngine(databaseType, logicSQL, shardingRule);
SQLStatement result = parsingEngine.parse();
if (result instanceof InsertStatement) {
((InsertStatement) result).appendGenerateKeyToken(shardingRule, parametersSize);
}
return result;
}
总结:1,代码片段中可以看出创建SQL解析器时已经传入了分片上下文ShardingContext,上下文中携带分片规则,数据库类型等信息,为SQL路由做数据准备0.2,SQL解析任务又由SQL解析器完美的交给了SQL解析引擎SQLParsingEngine,那么继续深挖SQL解析引擎是如何进行SQL解析的,且看SQL解析引擎源码如下。
二,SQL解析引擎如何解析SQL
io.shardingjdbc.core.parsing.SQLParsingEngine.parse()
public final class SQLParsingEngine {
private final DatabaseType dbType;
private final String sql;
private final ShardingRule shardingRule;
/**
* Parse SQL.
*
* @return parsed SQL statement
*/
public SQLStatement parse() {
LexerEngine lexerEngine = LexerEngineFactory.newInstance(dbType, sql);
lexerEngine.nextToken();
retur