前言
再讲SQL路由之前,先简要的将一个SQL解析,SQL解析是sharding-jdbc非常底层的东西,了解这个,
对于真正用这个中间件的作用相对来说稍微弱一点,但是也要了解一个大概。
ParsingSQLRouter
在SQL路由之前,都会调用该类的parse方法,进行SQL解析
public
SQL解析步骤
SQLParsingEngine的parse方法如下,根据dbType , 和查询语句的Type,构建SQL解析器,并且进行解析
public
第一步:
根据databaseType,选用不一样的词法解析器
// com.dangdang.ddframe.rdb.sharding.parsing.lexer.LexerEngineFactory
第二步:
调用词法解析器进行分词 , 主要就是将SQL进行分词。
第三步:
获取SQL解析器,并且进行SQL解析
public
根据databaseType 选用不同的词法解析器,主要是因为各大厂商的SQL语法有些不同,所以需要根据databaseType来区分,
然后根据SQL语句的类型,调用不同的SQL解析器,将SQL解析。 关于SQL解析这一块我也没有去细看,sharding-jdbc1.5以后
将SQL解析引擎替换了druid , 对SQL采取半理解的模式。
总结:
SQL解析分为两步, 第一步为 词法解析, 词法解析的意思是就是将SQL进行拆分。
例:
select
词法解析:
_user]
这么做的目的是什么? 是为了后面的SQL解析, 一个很直白的说法,通过词法解析,我们可以知道这个SQL语句是什么类型的SQL语句 ,到底是select,还是
insert , 都需要词法解析器去做。
SQL解析最后这一块我没有细看原理,不过我可以给大家截一张图
SQL语句
<select
上面的SQL,通过SQL解析器最后解析的结果如下: