天天看點

Mybatis之動态SQL解析

Mybatis動态Sql實作的元素主要有:

1.if

2.if-where

3.if-set

4.choose, when, otherwise

5.trim

6.foreach

說明:涉及比較複雜的業務需求時,需要應用mybatis的動态SQL,即通過 if, choose, when, otherwise, trim, where, set, foreach等标簽組合sql語句。

下面例子将以City表進行操作說明:

Mybatis之動态SQL解析

需求:根據 cityName和 cityType查詢城市資訊。如果cityName為空,根據cityType查詢;如果cityType為空,根據cityName查詢。

從上面查詢語句看出,如果cityName為空,會根據cityType查詢。查詢語句是:

這是一條錯誤的sql語句,解決此問題就需要用到if-where組合。例如:

where元素的作用就是:如果if有條件成立(即至少有一個子元素的條件傳回 SQL 子句),就插入一個”where”。并且,若語句的開頭為“AND”或“OR”,where 元素也會将其去掉。

set元素主要用在更新操作,功能和where元素差不多,主要是動态前置 SET 關鍵字(在set标簽包含的語句前加一個set)。例如:

上面sql語句中,如果cityType 為空,實際執行的if元素中,後面會帶一個逗号,但是set元素會删掉無關的逗号,是以最終執行的sql語句是:

MyBatis 提供了的choose 元素:所有查詢條件中隻選一個作為查詢條件(自上而下執行,發現一個條件成立便跳出執行,最終隻傳回一個),類似Java中的switch 。如果所有的條件都不滿足,就輸出otherwise中的内容。

如果cityCode 成立,輸出的語句是:

如果cityCode 不成立,cityName 成立,輸出的語句是:

如果cityCode 和cityName 都不成立,輸出的語句是:

自定義 trim 元素和 where 元素等價(利用trim來代替where元素的功能)。

trim元素的主要功能是在它包含的内容前加上字首prefix或字尾suffix,在它包含内容的首部移除其指定的内容(prefixOverrides)或尾部移除内容(suffixOverrides)。

(1.)trim實作if-where(select語句):

prefix:字首 where     

prefixoverride:去掉字首值and

(2.)trim實作if-set(update語句):

prefix:字首 set     

suffixOverrides:去掉字尾值 逗号,

foreach是對一個集合進行周遊,通常是在建構 IN 條件語句的時候。

foreach元素的屬性主要有 item,index,collection,open,separator,close。

item:表示集合中每一個元素進行疊代時的别名

index:用于表示在疊代過程中,每次疊代到的位置

collection:指定傳入參數的類型

open:開始時拼接的字元串

separator:表示在每次進行疊代之間以什麼符号作為分隔符

close:結束時拼接的字元串

collection屬性用于指定傳入參數的類型,主要有3種情況:

(1.)傳入的是單參數且參數類型是一個List類型的時候,collection屬性值為list。

對應Dao中的Mapper檔案:

對應xml檔案中的配置:

(2.)傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array。

(3.)傳入的參數是多個的時候,則需要封裝成一個Map。

注意:傳入的參數為Map時,collection的值“codes”實際上是存儲在map中的key(鍵)。

例如: