一般對於一個choose是能夠拆分爲多個if條件的,可是很顯然,某些場景下,使用if else的形式比多個if 要更加簡單清晰
if和choose裏面when後的條件都是使用test進行設置的
內容處理
trim用於動態內容頭尾的處理,能夠添加前綴prefix或者添加後綴suffix
也能夠移除匹配的指定的前綴prefixOverrides,或者移除匹配的指定的後綴suffixOverrides
簡言之能夠藉助於trim對拼接內容的頭尾進行處理
where至關於
<trim prefix="WHERE" prefixOverrides="AND |OR ">
表示在最前面添加where,若是最開始是AND 或者OR 將會進行刪除
set至關於<trim prefix="SET" suffixOverrides=",">
表示在最前面添加set,若是最後面是一個
逗號,
將他刪除
循環遍歷
foreach用於動態的循環拼接,至關於for循環動態拼接內容
for(int i =0;i<list.size;i++){
String s +=「...」;
}
對於foreach,須要指明須要遍歷循環的參數名稱,經過collection指定
須要指定循環變量,也就是在循環中使用哪一個變量指代,至關於Object o = list.get(i); 使用item指定的就是這個o
還能夠指定變量用於記錄索引,經過這個索引變量能夠得到迭代的次數索引,經過index
對於open, separator, close,就是在字符串拼接的開頭,中間,結尾,添加的分割符信息。
總結
在實際項目應用中,老是有不少的查詢條件或者關聯語句,可是並非每一次的查詢都須要完整的語句,難道每種場景都從新寫一個SQL嗎?
顯然是效率低下的,Mybatis的動態SQL就是解決這種問題的
動態SQL就是根據條件動態的處理SQL語句,進而達到不一樣場景不一樣SQL的做用,也就是寫一次SQL,而後通過條件分支或者內容的處理,可以在多個場景進行使用
從上面的介紹也能夠看得出來,動態SQL的本質在於根據條件,對SQL語句處理,能夠理解爲文本處理工做
他只是Mybatis一次執行時實際執行的SQL語句,無論是if仍是choose 仍是where仍是trim,再或者是foreach,都是簡單的對SQL進行拼接、處理、優化
對於程序員來講,最重要的就是條件的判斷,也就是test後面的語句的書寫,再就是確認各類條件判斷後處理後的SQL語句不會出現什麼問題就夠了
可是還須要注意,儘管Mybatis有動態SQL功能,能夠靈活的拼接SQL,可是也不要濫用,儘量業務邏輯比較類似的,經過條件進行控制
試想,若是一整個表的全部邏輯全都是一個SQL,經過各類if choose拼接起來,可讀性是一個很大的問題,因此也要合理
簡單說幾點就是:
- 動態SQL本質就是SQL語句的文本處理工做,無他
- 要注意條件語句的設置
- 不要濫用動態SQL,該分開仍是得分開
對於動態SQL根本仍舊是SQL的編寫,因此須要具備良好的SQL語句編寫能力,動態SQL只是可讓他更加靈活,並不能解決你SQL中的任何問題,或者性能問題
要始終記住,他只是處理須要執行的SQL