本文转自“天河聊技术”微信公众号java
在看词法解析以前咱们先看下sharding-jdbc的项目结构,美利金融财务平台项目采用的是1.5版本,所以这里的源码解析是针对这个版本进行源码解析的,后续的版本中实现大纲是没变的,所以这里的源码解析不会影响对其余版本的源码理解。mysql
源码项目结构以下spring
sharding-jdbc-config-parent模块是sharding-jdbc自身为了和spring集成实现的一些配置。sql
sharding-jdbc-core是主要实现。数据库
sharding-jdbc-transaction-parent是柔性事务实现。api
core maven子项目的包结构微信
com.dangdang.ddframe.rdb.sharding.parsing.lexer 词法解析。架构
com.dangdang.ddframe.rdb.sharding.api 定义了分片规则相关的抽象实现。maven
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路由实现。
词法解析
这个类就是词法解析的引擎类
那么什么地方会调用这个类呢,确定是解析sql的时候才会解析词法,所以咱们找源码中关于sql解析实现,所以咱们找到了这个类引用了对词法解析引擎类的实现
那么咱们想看词法解析的具体实现,咱们就要找到这个类的一个具体实现或者引用这个类的具体实现类跟下源码,因而咱们找到了一个select语句解析器的抽抽象类中引用了AbstractSQLParser引用,离✌️不远了,咱们接着找这个select语句解析器抽象类的实现类,咱们以闪电般的速度找到了一个mysql实现,咱们随便找一个MySQLSelectParser类的一个方法。
咱们进入到skipAll()这个方法,咱们锁定了词法解析器的业务方法
固然对源码比较熟悉的直接就能够找到这个方法,咱们这里的步骤是针对你们第一遍看源码怎么找源码看,相信你们都有一种无处下手的感受,曾几什么时候我也是,好的,书归正传,咱们找到了词法解析器的业务方法,那么我就来看下这个实现逻辑是什么样的。
词法解析业务方法
skipIgnoredToken()这行代码是跳过无用的token
new Tokenizer(input, dictionary, offset) 这行代码中的dictionary是具体数据库的关键字字典,词法解析器引擎的mysql子类
词法解析器引擎类业务方法中有扫描变量、字符串、标识符、十六进制数、数字、符号的实现,咱们跟踪下扫描符号的实现,其余的都同样,看下这行代码
currentToken = new Tokenizer(input, dictionary, offset).scanSymbol();
看上图 词法解析引擎中保存了当前的token,sql解析就是根据解析到的这个当前token进行下一步sql解析的,到这里词法解析流程就结束了,仅供参考。
欢迎关注本人微信公众号“天河聊技术”,有更多javaWeb技术、架构、互金行业大数据相关的技术源码解析的文章。