MyBatis高階使用 動態SQL

2022-08-18 23:30:15 字數 2101 閱讀 7415

mybatis精簡了元素種類,在mybatis3中,我們只需要學習以下4種元素:

if

choose(when,otherwise)

trim(where,set)

foreach

動態sql通常要做的事情就是根據條件包含where子句的一部分,比如:

select * from blog 

where state = 『active』

and title like #

這條語句提供了一種可選的查詢文字功能。如果沒有傳入「title」,那麼就返回所有處於「active」狀態的博文。反之則還要進行根據「title」引數的模糊查詢。

在乙個標籤中,可以如上面例子一般,巢狀多個if元素。

如果我們不想應用所有的條件語句而是像switch語句一般進行選擇的話,那麼我們就應該使用choose元素。

修改上面那個例子,如果存在「title」引數則按照「title」查詢,如果提供了「author」引數就按照「author」查詢。如果兩者都沒有提供就返回所有符合條件的博文。

select * from blog where state = 『active』

and title like #

and author_name like #

and featured = 1

那麼我們現在希望將所有的where子句的條件都變成動態sql,可能會編寫出這樣的**:

select * from blog 

where

state = #

and title like #

and author_name like #

然而如果這些條件乙個都沒有匹配上的話,結果sql語句很可能會變成這樣:

select * from blog

where

如果只有第二個匹配上的話,會變成這樣:

select * from blog

where

and title like 『sometitle』

這些查詢都會失敗,為了解決這個問題,mybatis有乙個簡單的解決方案:

select * from blog 

state = #

and title like #

and author_name like #

where元素只有在至少乙個子元素的條件返回sql子句的情況下才插入「where」子句。而且若語句的開頭為and或者or也會將它們去除。

如果希望定製where的行為,我們可以通過自定義trim元素來定製where元素的功能。比如和where元素等價的自定義trim元素為:

... 

類似的用於動態更新語句的解決方案叫做set。set元素可以用於動態包含所需要更新的列,而捨棄其他。比如:

update author

username=#,

password=#,

email=#,

bio=#

where id=#

這裡set元素會動態前置set關鍵字同時刪除無關的逗號。

動態sql的另外乙個常用的操作需求就是對乙個集合進行遍歷通常是在構建in條件語句的時候,比如:

select *

from post p

where id in

#

foreach元素的功能非常強大,它袁旭你指定乙個集合,宣告可以在元素體內使用的集合項和索引變數。也允許你指定開頭和結尾的字串以及在迭代結果之間放置分隔符。

注意:我們可以使用任何可迭代物件傳遞給foreach作為集合引數。當使用可迭代物件或者陣列時,index是當前迭代的次數,itme是本次迭代獲取的元素。當使用map物件時,index是鍵,item是值。

Mybatis高階使用

mybatis的延遲載入 何為延遲載入 通過前面的學習,我們已經掌握了 mybatis中多表查詢的配置及實現,可以實現物件的關聯查 詢。實際開發過程中很多時候我們並不需要在載入使用者資訊時就一定要載入他的訂單資訊。此時 就是我們所說的延遲載入。作用就是在需要用到資料時才進行載入,不需要用到資料時就不...

spring整合mybatis後,列印SQL語句

網上說mybatis的早前版本配置列印sql還比較簡單,在3.0.6之後配置方式修改了。現在的spring mybatis.xml配置如下 不錯,列印sql只需要加乙個setting就可以了。mybatis的日誌列印方式比較多,slf4j log4j log4j2 jdk logging commo...

spring整合mybatis後,列印SQL語句

網上說mybatis的早前版本配置列印sql還比較簡單,在3.0.6之後配置方式修改了。現在的spring mybatis.xml配置如下 mybatis config.xml 不錯,列印sql只需要加乙個setting就可以了。mybatis的日誌列印方式比較多,slf4j log4j log4j...