日韩性视频-久久久蜜桃-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解析流程详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 香蕉视频在线播放 | 成人免费看片视频 | 不卡一区二区在线观看 | 性调教学院高h学校 | 乱码av | 成人女同在线观看 | 久久波多野结衣 | 波多野结衣黄色 | 亚洲xx网| 日日夜夜天天干 | 国产91网址 | 手机在线观看av网站 | 国产手机在线观看 | 精品国产乱码久久久久久久 | 精品中文字幕一区 | 麻豆三级 | 久久视频免费在线观看 | 亚洲男人的天堂在线观看 | 亚洲精品国产精品乱码不99按摩 | av一区不卡 | 精品人妻一区二区三区四区久久 | 中文字幕无线精品亚洲乱码一区 | 亚洲天堂男人天堂 | 久久精品这里只有精品 | 国产成人精品午夜福利Av免费 | 娇妻被老王脔到高潮失禁视频 | 天天射日日射 | 男人天堂视频网 | 一区二区三区不卡在线观看 | 国产精品97 | 麻豆一区产品精品蜜桃的特点 | 一级片免费视频 | 国产精品av一区二区 | 亚洲毛茸茸 | 奶水旺盛的少妇在线播放 | 国产乱了高清露脸对白 | 日韩激情中文字幕 | 欧美乱色 | 欧美自拍区 | 香蕉视频国产 | 中文字幕在线视频免费 | av在线资源网 | 在线成人免费视频 | 黄色美女一级片 | eeuss国产一区二区三区 | 国产手机在线视频 | 大地资源中文第三页 | 91在线无精精品入口 | 三级性生活片 | 91啪国产在线 | 色综网 | 亚洲一区www| a天堂视频在线观看 | 精品国产伦一区二区三 | 91色精品| 黄色片成年人 | 老司机av影院 | 亚洲插插 | 欧美老熟 | 国产视频二 | 国产精品久久久久久久久久久不卡 | 国产在线不卡视频 | 欧美aa大片 | 午夜精品一区 | 高跟91白丝 | 国产黄色大片网站 | melody在线高清免费观看 | 天堂在线精品视频 | 久久影视 | 国产高潮久久 | 精品国产一区二区三区久久 | 国产正在播放 | 亚洲视频在线观看一区二区 | 成人免费观看视频网站 | 日韩一区二区欧美 | 日本精品视频网站 | 国产在线一区二区视频 | 国产又黄又粗又长 | 国产3级在线 | 亚洲成熟女性毛茸茸 | 国产美女免费网站 | 亚洲狼人干| 国产伦精品一区二区三区在线观看 | 久久久久国产精品一区二区 | 国产粉嫩呻吟一区二区三区 | 国产毛片久久久久 | 99资源 | 你懂的网址在线 | 国产素人在线 | 麻豆一区在线 | 91社区福利 | 国产一区视频在线 | 激情av网| 日本一区中文字幕 | 97久久久| 国产原创91 | 中文字幕性 | 一区二区三区激情视频 | 饥渴少妇伦色诱公 |