前面學習使用mybatis時會發現,我們之前自己在程序中寫sql訪問數據庫時,有時候情況會很複雜,需要程序自己根據實際的情況,進行各種判斷,進行拼接字符串,最終生成響應的sql語句,列如:
string sql;
sql += "select * from t_cat";
if(name != null && name != "")
{
sql += "name ="+name;
}
if(age!= null && age!= 0)
{
sql += "age ="+age;
}
但是我們的mybatis的sql是寫在xml中的,如何實現上面這樣動態的生成需要的sql語句呢,mybatis如此強大當然已經提供了動態SQL這個功能啦,那就是在sql映射文件中使用標籤來完成動態sql選擇
if 判斷,test爲判斷條件, 成立就拼接,不成就跳過。(很簡單吧!)需要注意的是,有些符號需要使用轉義字符,例如(&&,“”等)。
我們發現,在拼接sql字符串的時候,往往每個條件的頭或者尾部符號的拼接讓我們很麻煩,列如下面中的and,我讓我們在傳入的條件參數中沒有傳遞id的值,那麼最終的sql語句就會變成 select * from catdao and cname = tom and cgander = 0 and cage = 1;這樣訪問數據庫無疑會出現問題。<where>標籤就幫我們解決了這個問題,他可以替代sql語句中的 WHERE,並且可以自動的幫我們刪除每個條件中,前面多餘的and,注意也僅僅是前面多餘的and,如果把and寫在後邊就不好使啦(現在感覺這個標籤不是很好用哈,這裏推薦使用<trim>標籤,比<where>更強的)
<trim>標籤用於字符串的處理,prefix屬性可以在整個字符串的前邊添加某個字符串;suffix屬性可以在整體字符串的末尾添某個字符串;prefixOverrides屬性則可以判斷某個字符串在某一句的前部是不是多餘,如果多餘就刪除;suffixOverrides屬性與前邊相似,判斷的事每句的結尾處,是不是有某一個多餘的字符串,如果有則刪除;
使用了trim標籤後,這樣在動態sql條件中q開頭和末尾多出來的 and就都可以自動去除掉了,是不是很方便。
<foreach>標籤用於對集合的遍歷,當我們調用方法的參數是一個collection,或者爲map時。我們就可以使用<foreach>標籤來遍歷並取得參數,從而進行sql語句的拼接,通常是在進行構建IN條件語句的時候。列如:
collection屬性:指定要遍歷集合的key(這裏有個問題需要注意,例如如果集合爲list,該屬性的值只能填list。這裏推薦使用@param(“ids”)起別名的方式來定義集合的key,這樣我們就可以自己想寫什麼就寫什麼);
open屬性:使用什麼開頭;
close屬性:使用什麼結尾;
item屬性:給每次遍歷集合中的元素起個名字,之後可以使用這個名字獲取該值;
separator屬性:使用什麼作爲分割;
index屬性:索引,
如果遍歷的是一個list:
index:指定的變量保存了當前的索引;
item:指定的變量保存了當前遍歷元素的值;
如果遍歷的是一個map:
index:指定的變量就保存了當前遍歷元素的key;
item:指定的變量就是保存當前遍歷元素的value;
<choose>標籤的作用是分之選擇。用法比較簡單,只有其中有一個條件滿足,其他條件就不會執行。他與<if>比較類似,但是與if的區別就是相當於if與if...else if...else 的區別 ,直接上例子簡單易懂:
<set>標籤用於數據庫表的更新,通常我們採用<if>與<set>結合的方式來進行數據庫表動態更新操作。
<include>標籤用於引用可重用的sql語句,通常與<sql>標籤配合使用
另外,補充瞭解:
類型 |
僞屬性 |
僞屬性對應的 Java 方法 |
List、Set、Map |
size、isEmpty |
List/Set/Map.size(),List/Set/Map.isEmpty() |
List、Set |
iterator |
List.iterator()、Set.iterator() |
Map |
keys、values |
Map.keySet()、Map.values() |
Iterator |
next、hasNext |
Iterator.next()、Iterator.hasNext() |
_databaseId 變量:代表當前環境
_parameter變量:代表傳入進來的參數
1)、若傳入了單個的參數:_parameter就代表這個參數
2)、若傳入了多個的參數:_parameter則代表多個參數集合起來的map
這裏可以看到,使用不同的sqlSession都取得catDao類,以同樣的參數訪問相同的方法,只訪問了一次數據庫。
jar包與xml的下載地址:https://download.csdn.net/download/qq_25106373/10886233。