今天是劉小愛自學Java的第117天。
感謝你的觀看,謝謝你。
主要就學了一個內容,動態sql的使用,它是mybatis框架中非常強大的一個特性。
其中一共有5種標籤:
if語句
choose when otherwise語句
where語句
set語句
foreach語句
這些標籤的使用可以在sql語句中做出判斷,如果用Java程式碼編寫,用對應語句判斷亦可。
而動態sql的好處在於:在Java程式碼中就不需要考慮sql語句相關的業務邏輯了。
一、動態sql之if語句
案例:查詢男性使用者,如果輸入了使用者名稱,按使用者名稱模糊查詢。
①案例說明
如果有使用者名稱,按照該使用者名稱模糊查詢,查詢滿足條件的男性使用者。
如果沒有使用者名稱,查詢表中的男性使用者。
②動態sql的編寫
if標籤用以判斷使用者名稱是否為空:
如果不為空並且不是空字串,將模糊查詢語句拼接到sql中。
反之,只需要執行查詢男性使用者語句。
值得注意的是:
模糊查詢%與username值之間要有空格,上述我寫的就沒有加空格,導致沒法正常查詢。
程式碼寫完,做一個測試:
③測試一:使用者名稱為liuxiaoai
根據if標籤判斷,模糊查詢出使用者名稱為liuxiaoai的所有男性使用者,liuxiaoai2也滿足要求。
④測試二:使用者名稱為null
使用者名稱為空,那麼模糊查詢語句不執行,查詢出所有的男性使用者。
關於測試結果,因為很長一條,我就沒有全部截圖,大致知道是個什麼結果就行。
二、動態sql之choose when otherwise語句
案例:查詢男性使用者,如果輸入了使用者名稱則按照使用者名稱模糊查詢,否則如果輸入了年齡則按照年齡查詢,否則查詢使用者名稱為“liuxiaoai”的使用者。
①案例分析
如果使用者名稱不為空,就拼接根據使用者名稱模糊查詢語句。
如果上述條件不滿足,年齡不為空則拼接根據年齡查詢語句。
如果上述條件都不滿足,就拼接使用者名稱為“liuxiaoai”的查詢語句。
②動態sql的編寫
when就相當於Java中if……else if語句的一個判斷,othewise就相當於最後的else語句。
值得注意的是:
如果前面when標籤中的條件滿足了,後面when標籤中的條件即使滿足也不會執行。
程式碼編寫完畢,做一個測試:
③測試一:所有條件都滿足
使用者名稱和年齡都不為空,條件都滿足,但是隻執行前面條件裡的語句,後面條件即使滿足也無效。
④測試二:所有條件都不滿足
如果條件都不滿足,則執行otherwise中的內容,也就是查詢使用者名稱為liuxiaoai的男性資料。
三、動態sql之where語句
案例:查詢所有使用者,如果輸入了使用者名稱按照使用者名稱進行模糊查詢,如果輸入年齡,按照年齡進行查詢,如果兩者都輸入,兩個條件都要成立。
①案例分析
where-if標籤和上面的when不同的地方在於:
where-if是隻要滿足條件就執行。
when是隻執行最先滿足的。
②動態sql的編寫
如果使用者名稱不為空,則拼接根據使用者名稱模糊查詢語句。
如果年齡不為空,則拼接根據年齡查詢語句。
程式碼編寫完畢,做一個測試:
③測試方法一:前面的條件滿足
模糊查詢出對應的語句,一共有兩條。
④測試方法二:所有的條件滿足
在前面條件滿足的基礎上,再次做出篩選,篩選出年齡滿足條件的語句,就只有1條了。
四、動態sql之set語句
案例:修改使用者資訊,如果引數user中的某個屬性為null,則不修改。
我們如果使用常規的修改屬性方法:
該方法就有一個問題,我們傳遞的引數user中,只設置了username屬性,其它都為空。
這樣的話,資料庫中其它的屬性也就變成null了。
如何有選擇性的修改?
比如在引數user中只設置了username屬性,那麼值修改資料庫中對應的屬性,其它都不修改。
就需要使用到set語句了。
①案例分析
普通修改等於是將user中的每一個屬性都做出了修改。
所以如果引數中的user某個屬性為null,也就將該屬性修改成null了。
而要解決這個問題,動態拼接sql時加一個判斷即可。
②動態sql的編寫
在set標籤中,使用if語句優先做一個判斷,如果不為空,才完成sql拼接,才修改屬性。
程式碼編寫完畢,做一個測試:
使用set-if標籤後,再次修改資料,就會發現只修改引數user中有的資料了,其它屬性不變。
五、動態sql之foreach語句
案例:根據多個id查詢對應的使用者
①案例分析
根據多個id查詢時,在sql語句中是使用in這個關鍵字來完成查詢。
引數為一個數組時,需要將其遍歷。
②動態sql的編寫
使用foreach標籤完成遍歷,和增強for非常類似:
collection:指的需要遍歷的集合。
item:指的就是每次遍歷的具體值。
separator:指的就是sql語句中in(1,2,3)中的逗號。
open:指的就是in中左邊的括號。
close:指的就是in中右邊的括號。
程式碼編寫完畢,做一個測試:
③測試資料
引數為一個long陣列,對應多個id,查詢出多條id對應的資料。
最後
謝謝你的觀看。
如果可以的話,麻煩幫忙點個贊,謝謝你。