mybatis框架之動態sql的詳細使用

今天是劉小愛自學Java的第117天。

感謝你的觀看,謝謝你。

mybatis框架之動態sql的詳細使用

主要就學了一個內容,動態sql的使用,它是mybatis框架中非常強大的一個特性。

其中一共有5種標籤:

if語句

choose when otherwise語句

where語句

set語句

foreach語句

這些標籤的使用可以在sql語句中做出判斷,如果用Java程式碼編寫,用對應語句判斷亦可。

而動態sql的好處在於:在Java程式碼中就不需要考慮sql語句相關的業務邏輯了。

一、動態sql之if語句

案例:查詢男性使用者,如果輸入了使用者名稱,按使用者名稱模糊查詢。

mybatis框架之動態sql的詳細使用

①案例說明

如果有使用者名稱,按照該使用者名稱模糊查詢,查詢滿足條件的男性使用者。

如果沒有使用者名稱,查詢表中的男性使用者。

②動態sql的編寫

if標籤用以判斷使用者名稱是否為空:

如果不為空並且不是空字串,將模糊查詢語句拼接到sql中。

反之,只需要執行查詢男性使用者語句。

值得注意的是:

模糊查詢%與username值之間要有空格,上述我寫的就沒有加空格,導致沒法正常查詢。

程式碼寫完,做一個測試:

mybatis框架之動態sql的詳細使用

③測試一:使用者名稱為liuxiaoai

根據if標籤判斷,模糊查詢出使用者名稱為liuxiaoai的所有男性使用者,liuxiaoai2也滿足要求。

④測試二:使用者名稱為null

使用者名稱為空,那麼模糊查詢語句不執行,查詢出所有的男性使用者。

關於測試結果,因為很長一條,我就沒有全部截圖,大致知道是個什麼結果就行。

二、動態sql之choose when otherwise語句

案例:查詢男性使用者,如果輸入了使用者名稱則按照使用者名稱模糊查詢,否則如果輸入了年齡則按照年齡查詢,否則查詢使用者名稱為“liuxiaoai”的使用者。

mybatis框架之動態sql的詳細使用

①案例分析

如果使用者名稱不為空,就拼接根據使用者名稱模糊查詢語句。

如果上述條件不滿足,年齡不為空則拼接根據年齡查詢語句。

如果上述條件都不滿足,就拼接使用者名稱為“liuxiaoai”的查詢語句。

②動態sql的編寫

when就相當於Java中if……else if語句的一個判斷,othewise就相當於最後的else語句。

值得注意的是:

如果前面when標籤中的條件滿足了,後面when標籤中的條件即使滿足也不會執行。

程式碼編寫完畢,做一個測試:

mybatis框架之動態sql的詳細使用

③測試一:所有條件都滿足

使用者名稱和年齡都不為空,條件都滿足,但是隻執行前面條件裡的語句,後面條件即使滿足也無效。

④測試二:所有條件都不滿足

如果條件都不滿足,則執行otherwise中的內容,也就是查詢使用者名稱為liuxiaoai的男性資料。

三、動態sql之where語句

案例:查詢所有使用者,如果輸入了使用者名稱按照使用者名稱進行模糊查詢,如果輸入年齡,按照年齡進行查詢,如果兩者都輸入,兩個條件都要成立。

mybatis框架之動態sql的詳細使用

①案例分析

where-if標籤和上面的when不同的地方在於:

where-if是隻要滿足條件就執行。

when是隻執行最先滿足的。

②動態sql的編寫

如果使用者名稱不為空,則拼接根據使用者名稱模糊查詢語句。

如果年齡不為空,則拼接根據年齡查詢語句。

程式碼編寫完畢,做一個測試:

mybatis框架之動態sql的詳細使用

③測試方法一:前面的條件滿足

模糊查詢出對應的語句,一共有兩條。

④測試方法二:所有的條件滿足

在前面條件滿足的基礎上,再次做出篩選,篩選出年齡滿足條件的語句,就只有1條了。

四、動態sql之set語句

案例:修改使用者資訊,如果引數user中的某個屬性為null,則不修改。

我們如果使用常規的修改屬性方法:

mybatis框架之動態sql的詳細使用

該方法就有一個問題,我們傳遞的引數user中,只設置了username屬性,其它都為空。

這樣的話,資料庫中其它的屬性也就變成null了。

如何有選擇性的修改?

比如在引數user中只設置了username屬性,那麼值修改資料庫中對應的屬性,其它都不修改。

就需要使用到set語句了。

mybatis框架之動態sql的詳細使用

①案例分析

普通修改等於是將user中的每一個屬性都做出了修改。

所以如果引數中的user某個屬性為null,也就將該屬性修改成null了。

而要解決這個問題,動態拼接sql時加一個判斷即可。

②動態sql的編寫

在set標籤中,使用if語句優先做一個判斷,如果不為空,才完成sql拼接,才修改屬性。

程式碼編寫完畢,做一個測試:

mybatis框架之動態sql的詳細使用

使用set-if標籤後,再次修改資料,就會發現只修改引數user中有的資料了,其它屬性不變。

五、動態sql之foreach語句

案例:根據多個id查詢對應的使用者

mybatis框架之動態sql的詳細使用

①案例分析

根據多個id查詢時,在sql語句中是使用in這個關鍵字來完成查詢。

引數為一個數組時,需要將其遍歷。

②動態sql的編寫

使用foreach標籤完成遍歷,和增強for非常類似:

collection:指的需要遍歷的集合。

item:指的就是每次遍歷的具體值。

separator:指的就是sql語句中in(1,2,3)中的逗號。

open:指的就是in中左邊的括號。

close:指的就是in中右邊的括號。

程式碼編寫完畢,做一個測試:

mybatis框架之動態sql的詳細使用

③測試資料

引數為一個long陣列,對應多個id,查詢出多條id對應的資料。

最後

謝謝你的觀看。

如果可以的話,麻煩幫忙點個贊,謝謝你。