本文轉自「天河聊技術」微信公衆號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技術、架構、互金行業大數據相關的技術源碼解析的文章。