Mybatis動態sql是做什麼的?都有哪些動態sql?簡述一下動態sql的執行原理?

Mybatis動態sql的作用

動態sql就是(在進行sql操作的時候)動態的根據屬性值(所匹配的條件)來拼接數據庫執行的sql語句,也就是多次查詢或變更操作,根據傳入的屬性值不同,動態拼接出不同的可執行sql。包含判斷爲空、循環等;

 

Mybatis動態sql(有哪些)標籤:

1、<if>: 

if是爲了判斷傳入的值是否符合某種規則,比如是否不爲空;

 

2、<where>:

 where標籤可以用來做動態拼接查詢條件,當和if標籤配合的時候,不用顯示的聲明類似where 1=1這種無用的條件;

 

3、<choose><when><otherwise>:

這是一組組合標籤,他們的作用類似於 Java 中的 switch、case、default。只有一個條件生效,也就是隻執行滿足的條件 when,沒有滿足的條件就執行 otherwise,表示默認條件;

 

4、<foreach>:

foreach標籤可以把傳入的集合對象進行遍歷,然後把每一項的內容作爲參數傳到sql語句中,裏面涉及到 item(具體的每一個對象), index(序號), open(開始符), close(結束符), separator(分隔符);

 

5、<include>:

include可以把大量重複的代碼整理起來,當使用的時候直接include即可,減少重複代碼的編寫

 

6、<set>:

適用於更新中,當匹配某個條件後,纔會對該字段進行更新操作

 

7、<trim>:

是一個格式化標籤,主要有4個參數:

    prefix(前綴);

    prefixOverrides(去掉第一個標記);

    suffix(後綴);

    suffixOverrides(去掉最後一個標記);

 

動態sql的執行原理

第一部分:在啓動加載解析xml配置文件的時候進行解析,根據關鍵標籤封裝成對應的handler處理對象,封裝成sqlSource對象存在mappedStatement。

調用流程:

I、SqlSessionFactoryBuilder對builder對象的時候,調用XMLConfigBuilder解析sqlMapConfig.xml配置文件,在解析過程中使用到了私有的mapperElement(XNode parent)方法

II、上面方法中通過構建XMLMapperBuilder,獲取到所有的配置mapper配置,

在調用private void configurationElement(XNode context)方法進行解析mapper.xml,通過void buildStatementFromContext(List<XNode> list, String requiredDatabaseId)方法解析mapper.xml內的每一個標籤

III、循環中構建XMLStatementBuilder對象,調用parseStatementNode()方法來封裝mappedStatment對象,

IIII、在過程中需要構建sqlSource對象,通過XMLLanguageDriver對象進行處理,在XMLLanguageDriver中構建解析動態標籤對象XMLScriptBuilder

第二部分:在執行過程中獲取sqlSource中獲取bondSql對象時,執行相應的標籤handler

調用查詢執行到BaseExecutor的query方法時候會去getBoundSql並且將參數傳進去,

在sqlSource接口DynamicSqlSource實現類中,調用getBoundSql方法執行過程共創建DynamicContext對象進行判定解析封裝成SqlSource對象返回。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章