日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sql server解析xml属性为表格_Mybatis中SqlSource解析流程详解

發布時間:2025/3/19 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql server解析xml属性为表格_Mybatis中SqlSource解析流程详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面幾篇文章都在詳細分析mapper的加載過程,但是始終沒有看到sql的解析過程,今天來詳細分析下。

解析sql的位置

前面分析到不管是通過注解還是通過xml方式生成mapper,最終都是調用MapperBuilderAssistant類的addMappedStatement方法,這個方法接受的其中一個SqlSource參數,SqlSource類中就是XML文件或者注解方法中映射語句的實現。

那么SqlSource對象是在哪里創建的呢?

在通過注解實現mapper的流程中是在MapperAnnotationBuilder類的parseStatement方法中對SqlSource進行初始化,初始化代碼如下圖:

通過xml文件實現mapper的流程中是在XMLStatementBuilder類的parseStatementNode方法中對SqlSource進行初始化,初始化代碼如下圖:

可以看到創建SqlSource對象都是通過LanguageDriver實現的,翻譯過來叫做語言驅動,它是一個接口,通過上面源碼可以看出來我們可以自己實現這個接口,并且可以指定使用哪個語言驅動。今天我們只關注mybatis自帶的一個實現XMLLanguageDriver。

XMLLanguageDriver介紹

XMLLanguageDriver類有重載了兩個createSqlSource方法,主要區別在于第二個參數script,從前面兩張源碼圖中可以知道接受XNode類型的script是在解析xml時使用,接受String類型的script是在解析注解時使用,今天只解析接受XNode類型的方法。

這個方法比較簡單只有兩步:初始化一個XMLScriptBuilder對象,執行XMLScriptBuilder對象的parseScriptNode方法。所以重點來到XMLScriptBuilder這個類。

XMLScriptBuilder詳解

XMLScriptBuilder類部分源碼如下圖:

XMLScriptBuilder的初始化比較簡單,要記住XNode context對應的是xml中的一個select、update等節點,在最后調用了initNodeHandlerMap方法設置了select、update等節點子節點對應的處理器。

接著是parseScriptNode方法,可以看到parseScriptNode方法調用了parseDynamicTags方法生成了一個MixedSqlNode對象,然后根據屬性isDynamic判斷創建對應的SqlSource對象。

所以最終要看parseScriptNode方法,同時可以判斷isDynamic這個屬性肯定也會在這個方法中發生變化,parseScriptNode方法的源碼如下圖:

parseDynamicTags方法解析節點下面所有子節點進行遍歷,如果節點是文本節點這解析里面的內容生成SqlNode(這里是TextSqlNode或者StaticTextSqlNode)對象放到contents集合中。

如果是腳本節點比如where、if等就調用初始化時保存的節點處理器,如上圖的ForEachHandler、IfHandler處理器,這些對象的處理方法handleNode的第一行代碼又在調用parseDynamicTags方法,就像是一種遞歸。所以我們可以得出xml中的where、if、foreach這些節點時可以彼此包含的,解析時再進行遞歸解析。

當然要想調用parseDynamicTags方法,這些對象都是屬于當前類XMLScriptBuilder的內部類。

大的方向梳理了我們再來看這個方法到底在干什么,首先這個方法會收集SqlNode對象放到contents集合中,最后把contents作為參數生成MixedSqlNode對象。在處理的過程中如果遇到if、foreach等節點還會把contents傳遞進去,從上面的圖中可以看到ForEachHandler、IfHandler處理器也會調用parseDynamicTags方法生成MixedSqlNode然后再生成對應的SqlNode放到contents中。

所以最終來到兩個關鍵類MixedSqlNode、SqlNode,當然SqlNode肯定有各種子類。

MixedSqlNode與SqlNode

那么MixedSqlNode與SqlNode是什么樣子的呢?又是如何組合的?具體源碼如下圖:

可以看到SqlNode是一個接口,而MixedSqlNode只是他的一種實現類,同時來貼出來了靜態文本處理的類和if節點對應的IfSqlNode類,還有一些其他比如WhereSqlNode、ForEachSqlNode等就不再列出來了。

每一種實現類的初始化都比較簡單,比如StaticTextSqlNode是保存一段文本,IfSqlNode保存了if節點的test屬性對應的值和從if節點下解析出來的MixedSqlNode節點。

而他們有一個由SqlNode規定的apply方法,這才是他們正真的作用所在,比如MixedSqlNode是遍歷所有節點執行對應的apply方法,StaticTextSqlNode就只是把對應sql拼接到后面,IfSqlNode是在進行判斷后調用MixedSqlNode去執行if節點下所有的節點。

至于參數DynamicContext后面在調用的時候會分析的。

現在回到XMLScriptBuilder的parseScriptNode方法,方法在執行了parseDynamicTags方法后根據isDynamic屬性初始化了SqlSource,對應類結構圖如下圖:

我們主要關注DynamicSqlSource這個類,可以看到它就兩個屬性configuration、rootSqlNode,分別是全局配置和剛剛分析的MixedSqlNode,也可以從他的getBoundSql方法中看到后面對rootSqlNode的使用,這個留著后面分析。

總結

在configuration中有一個map屬性mappedStatements,他保存著MappedStatement對象,每個MappedStatement對象對應一個sql的所有信息,而MappedStatement也有一個屬性SqlSource,通過SqlSource能夠獲取到對應的sql,而sql的解析時依靠SqlNode。

今天的重點就在于生成SqlNode的過程,它是通過XMLScriptBuilder類是處理xml中crud節點生成。

這里有意思的是設計時是XMLScriptBuilder自帶處理節點的方法parseDynamicTags生成需要的MixedSqlNode,而在parseDynamicTags方法內部可能會調用內部類WhereHandler、IfHandler的handleNode方法生成對應的SqlNode,而在這些handleNode方法中第一步就是調用parseDynamicTags去生成MixedSqlNode,根據MixedSqlNode生成對應的SqlNode。通過這種遞歸實現了節點多層嵌套的解析。

第二個有意思的點在于SqlNode的框架設計,MixedSqlNode存儲一個SqlNode的集合,而具體的比如IfSqlNode又可以持有SqlNode,通過這樣實現,每種SqlNode都可以擁有所有各種的SqlNode功能,但是他們有擁有自己獨立的特點。

正是XMLScriptBuilder和SqlNode這種靈活的設計才可以使xml標簽有非常強大的支持,同時解析的時候又不至于太復雜。

Java程序員日常學習筆記,如理解有誤歡迎各位交流討論!

總結

以上是生活随笔為你收集整理的sql server解析xml属性为表格_Mybatis中SqlSource解析流程详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 97人妻精品一区二区三区 | 国产主播一区二区 | 精品国产乱码久久久久久蜜臀 | 国产精品精品软件视频 | 黑人玩弄人妻一区二区三区免费看 | 爱情岛亚洲品质自拍极速福利网站 | 一区二区导航 | 轻轻色在线观看 | 日韩有码第一页 | av直播在线观看 | 久久亚洲综合色图 | 91亚洲国产成人精品一区 | 亚洲一二三av | 粉嫩av四季av绯色av | 成年人免费在线观看视频网站 | 免费黄网站在线 | 日韩在线不卡一区 | 国产av电影一区 | 97se亚洲综合 | 超碰caoporen| 中文字幕乱码中文乱码b站 国产一区二区三区在线观看视频 | 高h在线观看 | 亚洲热久久| 国产精品久久久久电影 | 国产无遮挡aaa片爽爽 | 免费高清av | 日韩av电影中文字幕 | 欧美亚洲国产另类 | 中文字幕在线日亚洲9 | 熟妇高潮一区二区三区在线播放 | 国产精华一区二区三区 | 亚洲天天 | 国产精品51 | 亚洲福利视频一区二区 | 手机看片中文字幕 | 婷婷丁香花五月天 | 99国内揄拍国内精品人妻免费 | 天堂久久网| 久久久久美女 | 女人喂男人奶水做爰视频 | 欧美日韩在线成人 | 噜噜噜久久久 | 天天看视频 | 天天干导航| 婷婷在线播放 | 亚洲九色 | 欧美xxxxav| 在线免费观看欧美大片 | 国产农村妇女精品一区二区 | 色撸撸在线观看 | 国产精品自拍偷拍视频 | 国产a v一区二区三区 | 国产一级免费看 | 色伊人av| 不卡日韩| 国产香蕉久久 | 影音先锋伦理片 | 亚洲一区二区三区久久久成人动漫 | 国产精成人品免费观看 | 国产精品乱码一区 | 久久久久久国产精品三级玉女聊斋 | 无码人妻精品一区二区三区蜜桃91 | 5a毛片| 日韩不卡在线 | 欧美日韩在线一区 | 色香色香欲天天天影视综合网 | 国产99久久久国产精品 | 尤物视频在线免费观看 | 日本视频一区二区三区 | 色婷婷视频 | 亚洲青草| 污污视频在线看 | 国产成人a∨ | 久草国产在线观看 | 夜夜视频| 国产一级特黄毛片 | 久久久久久一区二区三区 | 国产在线不卡 | 欧美激情欧美激情在线五月 | 天天欲色 | 玖玖成人 | 在线观看的黄色网址 | 麻豆人妻少妇精品无码专区 | 国产精品丝袜 | gav成人| 在线观看精品 | 五月婷婷综合在线观看 | 免费在线观看污 | 亚洲va天堂va欧美ⅴa在线 | 国产日韩一区二区 | 亚洲啪av永久无码精品放毛片 | 求欧美精品网址 | 免费播放片大片 | 大乳女喂男人吃奶 | 超碰97免费在线 | 青草视频在线 | 免费一级a毛片夜夜看 | 天堂中文在线官网 | 亚洲美免无码中文字幕在线 |