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對象返回。