亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關(guān)于Mybatis動態(tài)sql中test的坑點(diǎn)總結(jié)

 更新時間:2022年01月14日 11:06:49   作者:塞海風(fēng)  
這篇文章主要介紹了關(guān)于Mybatis動態(tài)sql中test的坑點(diǎn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

總結(jié)Mybatis動態(tài)sql中test的坑

在mybatis中要實(shí)現(xiàn)動態(tài)sql,重要方式就是使用test,通過其中表達(dá)式返回的true、false來達(dá)到動態(tài)sql的拼接。隨著業(yè)務(wù)的復(fù)雜,test中的判斷將會越來越復(fù)雜,所以熟悉test中細(xì)節(jié)處理對動態(tài)sql來說尤為重要。

判斷相等的注意點(diǎn)

== 少打一個=

現(xiàn)在我們有一個Integer類型的參數(shù)typeId,需要當(dāng)typeId等于1的時候拼接一串sql,mybatis的xml如下:

<if test="count == 1">
? ? AND ISNULL(t.count)
</if>

這段代碼沒問題,但有一個隱藏的風(fēng)險,假如你少打一個 = 這段test將會始終返回ture這種邏輯錯誤mybatis會吞掉,所以養(yǎng)成判斷時常量寫在前變量寫在后是有必要的習(xí)慣,適用于很多語言,這種風(fēng)格尤其適用像js這類語言,其實(shí)java不經(jīng)常出現(xiàn)這種等價錯誤,不過還是建議養(yǎng)成習(xí)慣,因?yàn)槟阋院罂赡芙佑|其他語言。

所以如果這樣寫

test="count == 1"
//當(dāng)少打了一個等號
test="count = 1"http://很不幸,這mybatis擅作主張的處理為返回了count,true、false將會由count決定

test="1 == count"
//當(dāng)少打了一個等號
test="1 = count" //執(zhí)行時,mybatis會很友好的給你拋個異常

判斷字符是否相等

現(xiàn)在我們有一個String類型的參數(shù)type,需要當(dāng)type等于字符串AI的時候拼接一串sql,mybatis的xml如下

<if test="type== 'AI' ">
? ? AND t.type = 1
</if>

動態(tài)sql標(biāo)簽的小陷阱

現(xiàn)在MyBatis越來越受大家的喜愛了,它的優(yōu)勢大家都知道,我就不多說了,直接說重點(diǎn)。

MyBatis中提供動態(tài)SQL功能,我們可以使用<if><when><where><otherwise><foreach>等等,這樣我們就可以寫出根據(jù)條件生成的動態(tài)SQL了,但是,在這中間,我們經(jīng)常用到的<if>標(biāo)簽有一個小誤區(qū),一不小心就會掉下去

下面先舉個正常的例子

<select id="findActiveBlogWithTitleLike"?
? ? ?parameterType="Blog" resultType="Blog">
? SELECT * FROM BLOG?
? WHERE state = ‘ACTIVE'?
? <if test="title != null">
? ? AND title like #{title}
? </if>
</select>

在上面的例子中,當(dāng)title不等于null時,<if>標(biāo)簽中間的條件才會被拼接上,這樣,SQL語句就是動態(tài)的了。

但是,當(dāng)我們對所有條件進(jìn)行判斷時,你是否會這樣寫:

<select id="findActiveBlogWithTitleLike"?
? ? ?parameterType="Blog" resultType="Blog">
? SELECT * FROM BLOG?
? WHERE
? <if test="userId != null">
? ? ?state = ‘ACTIVE'?
? </if>

? <if test="title != null">
? ? AND title like #{title}
? </if>
</select>

沒問題吧?至少語法上不錯的,至少它可以正常生成一個SQL。

但是,不知道你注意到了沒,當(dāng)所有條件都為null的時候,會出現(xiàn)什么情況?

SELECT * FROM BLOG?
? WHERE

看到了吧?這樣的SQL能成功執(zhí)行么?

答案當(dāng)然是NO。

那么該怎么辦?那就要記住了,當(dāng)你寫動態(tài)SQL時候,先考慮一下會不會產(chǎn)生所有條件都不成立的情況,會不會出現(xiàn)只有一個WHERE而沒有條件的情況,那么你要做的就是加一個<where>標(biāo)簽將所有條件包起來。

<select id="findActiveBlogWithTitleLike"?
? ? ?parameterType="Blog" resultType="Blog">
? SELECT * FROM BLOG?
?<where>
? <if test="userId != null">
? ? ?state = ‘ACTIVE'?
? </if>

? <if test="title != null">
? ? AND title like #{title}
? </if>
?</where>
</select>

這樣,當(dāng)所有條件都不成立時,WHERE也不會被拼上。

這時,有機(jī)靈的小伙伴發(fā)現(xiàn)了,如果第一個條件不成立,第二個成立,那SQL會不會變成這樣?

?SELECT * FROM BLOG?
? ? ?WHERE
? ? AND title like #{title}

這個就放心好了,當(dāng)你用<if>標(biāo)簽包圍條件后,它會自動去掉AND的。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • SpringBoot AOP控制Redis自動緩存和更新的示例

    SpringBoot AOP控制Redis自動緩存和更新的示例

    今天小編就為大家分享一篇關(guān)于SpringBoot AOP控制Redis自動緩存和更新的示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 關(guān)于Selenium的UI自動化測試屏幕截圖功能實(shí)例代碼

    關(guān)于Selenium的UI自動化測試屏幕截圖功能實(shí)例代碼

    今天小編就為大家分享一篇關(guān)于Selenium的UI自動化測試屏幕截圖功能實(shí)例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • idea新建Springboot項(xiàng)目,設(shè)置默認(rèn)maven和jdk版本方式

    idea新建Springboot項(xiàng)目,設(shè)置默認(rèn)maven和jdk版本方式

    這篇文章主要介紹了idea新建Springboot項(xiàng)目,設(shè)置默認(rèn)maven和jdk版本方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java中ArrayList的使用詳細(xì)介紹

    Java中ArrayList的使用詳細(xì)介紹

    這篇文章主要介紹了Java中ArrayList的使用,本文給大家詳細(xì)講述該相關(guān)的知識點(diǎn),并且會通過大量的案例加以說明,需要的朋友可以參考一下
    2022-04-04
  • 小議Java的源文件的聲明規(guī)則以及編程風(fēng)格

    小議Java的源文件的聲明規(guī)則以及編程風(fēng)格

    這篇文章主要介紹了小議Java的源文件的聲明規(guī)則以及編程風(fēng)格,僅給Java初學(xué)者作一個簡單的示范,需要的朋友可以參考下
    2015-09-09
  • 通過JDK源碼角度分析Long類詳解

    通過JDK源碼角度分析Long類詳解

    這篇文章主要給大家介紹了關(guān)于通過JDK源碼角度分析Long類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用long類具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Java8中Optional的一些常見錯誤用法總結(jié)

    Java8中Optional的一些常見錯誤用法總結(jié)

    我們知道 Java 8 增加了一些很有用的 API, 其中一個就是 Optional,下面這篇文章主要給大家介紹了關(guān)于Java8中Optional的一些常見錯誤用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • mybatis調(diào)用mysql存儲過程并獲取返回值方式

    mybatis調(diào)用mysql存儲過程并獲取返回值方式

    這篇文章主要介紹了mybatis調(diào)用mysql存儲過程并獲取返回值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java中的異常處理用法及其架構(gòu)和使用建議

    Java中的異常處理用法及其架構(gòu)和使用建議

    Java同樣也提供了拋出異常、捕捉異常和finally語句的使用來處理程序異常,下面就來具體看一下Java中的異常處理用法及其架構(gòu)和使用建議:
    2016-06-06
  • spring boot 配置freemarker及如何使用freemarker渲染頁面

    spring boot 配置freemarker及如何使用freemarker渲染頁面

    springboot中自帶的頁面渲染工具為thymeleaf 還有freemarker這兩種模板引擎,本文重點(diǎn)給大家介紹spring boot 配置freemarker及如何使用freemarker渲染頁面,感興趣的朋友一起看看吧
    2023-10-10

最新評論