Mybatis動態SQL簡單瞭解 Mybatis簡介(四)

動態SQL概況

MyBatis 的強大特性之一即是它的動態 SQL
在Java開發中常常遇到條件判斷,好比:
if(x>0){
//執行一些邏輯........
}
 
Mybatis應用中,SQL映射一般位於XML文件內,在執行前須要將XML中的映射轉換爲最終要執行的SQL
在轉換中是否能夠根據輸入動態的處理SQL?這就是動態SQL,好比
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
上面的<if test="title != null"> 就是動態SQL處理,將會根據實際傳遞的title的值,動態的決定SQL的內容,是否包含最後面的AND

Mybatis的動態SQL元素很少,可是簡單高效,Mybatis的動態SQL元素相似JSTL

類型主要有三種:
  • 條件判斷
  • 內容處理
  • 循環處理
image_5c564f01_19a3
對於每種不一樣的類型又有各自的格式和屬性
image_5c564f01_51d9
 


條件處理

if是最基本的一種形式,語意爲:若是xxx就xxx
經過最基本的if能夠構造很複雜的條件測試語句,至關於
if(){
}
choose是特殊化的if,至關於
if(){
}else{
}
你能夠添加多個if,好比
if(){
}if(){
}if(){
}else{
} 
一般對於一個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循環動態拼接內容
forint 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
 
相關文章
相關標籤/搜索