sharding-jdbc源码解析之词法解析

在看词法解析之前我们先看下sharding-jdbc的项目结构,财务平台项目采用的是1.5版本,因此这里的源码解析是针对这个版本进行源码解析的,后续的版本中实现大纲是没变的,因此这里的源码解析不会影响对其他版本的源码理解。

源码项目结构如下

sharding-jdbc源码解析之词法解析_第1张图片

sharding-jdbc-config-parent模块是sharding-jdbc为了和spring整理实现的一些配置。

sharding-jdbc-core是主要实现。

sharding-jdbc-transaction-parent是柔性事务实现。

core maven子项目的包结构

com.dangdang.ddframe.rdb.sharding.parsing.lexer 词法解析。

com.dangdang.ddframe.rdb.sharding.api 定义了分片规则相关的抽象实现。

com.dangdang.ddframe.rdb.sharding.executor 执行逻辑。

com.dangdang.ddframe.rdb.sharding.merger 结果集归并实现。

com.dangdang.ddframe.rdb.sharding.parsing sql解析实现。com.dangdancom.dangdang.ddframe.rdb.sharding.rewrite sql改写实现。

com.dangdang.ddframe.rdb.sharding.routing.router sql路由实现。

下面进入今天的主题词法解析

这个类就是词法解析的引擎类

sharding-jdbc源码解析之词法解析_第2张图片

那么什么地方会调用这个类呢,肯定是解析sql的时候才会解析词法,因此我们找源码中关于sql解析实现,因此我们找到了这个类引用了对词法解析引擎类的实现

sharding-jdbc源码解析之词法解析_第3张图片

那么我们想看词法解析的具体实现,我们就要找到这个类的一个具体实现或者引用这个类的具体实现类跟下源码,于是我们找到了一个select语句解析器的抽抽象类中引用了AbstractSQLParser引用

sharding-jdbc源码解析之词法解析_第4张图片

离✌️不远了,我们接着找这个select语句解析器抽象类的实现类,我们以闪电般的速度找到了一个mysql实现

sharding-jdbc源码解析之词法解析_第5张图片

我们随便找一个MySQLSelectParser类的一个方法

我们进入到skipAll()这个方法,我们锁定了词法解析器的业务方法

sharding-jdbc源码解析之词法解析_第6张图片

当然对源码比较熟悉的直接就可以找到这个方法,我们这里的步骤是针对大家第一遍看源码怎么找源码看,相信大家都有一种无处下手的感觉,曾几何时我也是,好的,书归正传,我们找到了词法解析器的业务方法,那么我就来看下这个实现逻辑是什么样的。

sharding-jdbc源码解析之词法解析_第7张图片

词法解析业务方法

sharding-jdbc源码解析之词法解析_第8张图片

skipIgnoredToken()这行代码是跳过无用的token

sharding-jdbc源码解析之词法解析_第9张图片

new Tokenizer(input, dictionary, offset) 这行代码中的dictionary是具体数据库的关键字字典,词法解析器引擎的mysql子类

sharding-jdbc源码解析之词法解析_第10张图片

词法解析器引擎类业务方法中有扫描变量、字符串、标识符、十六进制数、数字、符号的实现,我们跟踪下扫描符号的实现,其他的都一样,看下这行代码

currentToken = new Tokenizer(input, dictionary, offset).scanSymbol();

sharding-jdbc源码解析之词法解析_第11张图片
sharding-jdbc源码解析之词法解析_第12张图片

看上图 词法解析引擎中保存了当前的token,sql解析就是根据解析到的这个当前token进行下一步sql解析的,到这里词法解析流程就结束了,仅供参考。



关注微信公众号

sharding-jdbc源码解析之词法解析_第13张图片

加入技术微信群

sharding-jdbc源码解析之词法解析_第14张图片

你可能感兴趣的:(sharding-jdbc源码解析之词法解析)