java學習筆記——mybatis 之 動態SQL、_parameter變量與_databaseId 變量、OGNL瞭解、緩存與添加第三方緩存庫EHChache

 前面學習使用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 方法

ListSetMap

sizeisEmpty

List/Set/Map.size(),List/Set/Map.isEmpty()

ListSet

iterator

List.iterator()Set.iterator()

Map

keysvalues

Map.keySet()Map.values()

Iterator

nexthasNext

Iterator.next()Iterator.hasNext()

 

_databaseId 變量:代表當前環境

 

_parameter變量:代表傳入進來的參數

               1)、若傳入了單個的參數:_parameter就代表這個參數

               2)、若傳入了多個的參數:_parameter則代表多個參數集合起來的map

 

 

 

 

 

 

 

 

 

 

 

 

 

這裏可以看到,使用不同的sqlSession都取得catDao類,以同樣的參數訪問相同的方法,只訪問了一次數據庫。

jar包與xml的下載地址:https://download.csdn.net/download/qq_25106373/10886233。

 

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