最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

== 少打一個(gè)=

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

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

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

所以如果這樣寫(xiě)

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

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

判斷字符是否相等

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

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

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

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

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

下面先舉個(gè)正常的例子

<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時(shí),<if>標(biāo)簽中間的條件才會(huì)被拼接上,這樣,SQL語(yǔ)句就是動(dòng)態(tài)的了。

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

<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>

沒(méi)問(wèn)題吧?至少語(yǔ)法上不錯(cuò)的,至少它可以正常生成一個(gè)SQL。

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

SELECT * FROM BLOG?
? WHERE

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

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

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

<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)所有條件都不成立時(shí),WHERE也不會(huì)被拼上。

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

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

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

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

相關(guān)文章

  • 完整java開(kāi)發(fā)中JDBC連接數(shù)據(jù)庫(kù)代碼和步驟

    完整java開(kāi)發(fā)中JDBC連接數(shù)據(jù)庫(kù)代碼和步驟

    這篇文章主要介紹了完整java開(kāi)發(fā)中JDBC連接數(shù)據(jù)庫(kù)代碼和步驟,需要的朋友可以參考下
    2015-09-09
  • Flink DataStream基礎(chǔ)框架源碼分析

    Flink DataStream基礎(chǔ)框架源碼分析

    這篇文章主要為大家介紹了Flink DataStream基礎(chǔ)框架源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 深入理解Java中的HashMap

    深入理解Java中的HashMap

    HashMap是Java程序員使用頻率最高的用于映射(鍵值對(duì))處理的數(shù)據(jù)類(lèi)型。隨著JDK(Java Developmet Kit)版本的更新,JDK1.8對(duì)HashMap底層的實(shí)現(xiàn)進(jìn)行了優(yōu)化,例如引入紅黑樹(shù)的數(shù)據(jù)結(jié)構(gòu)和擴(kuò)容的優(yōu)化等。本文將深入探討HashMap的結(jié)構(gòu)實(shí)現(xiàn)和功能原理
    2021-06-06
  • Java如何實(shí)現(xiàn)字符串每隔4位加空格

    Java如何實(shí)現(xiàn)字符串每隔4位加空格

    這篇文章主要介紹了Java如何實(shí)現(xiàn)字符串每隔4位加空格,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • CentOS安裝solr 4.10.3詳細(xì)教程

    CentOS安裝solr 4.10.3詳細(xì)教程

    這篇文章主要為大家詳細(xì)介紹了CentOS安裝solr 4.10.3的詳細(xì)教程 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡(jiǎn)要分析

    Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡(jiǎn)要分析

    這篇文章主要介紹Java網(wǎng)絡(luò)編程中的IO模型阻塞與非阻塞簡(jiǎn)要分析,文中附有示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Java使用TCP套接字實(shí)現(xiàn)多人聊天功能詳解

    Java使用TCP套接字實(shí)現(xiàn)多人聊天功能詳解

    這篇文章主要介紹了Java使用TCP套接字實(shí)現(xiàn)多人聊天功能,結(jié)合實(shí)例形式詳細(xì)分析了java使用socket通信實(shí)現(xiàn)tcp協(xié)議下的聊天功能客戶(hù)端與服務(wù)器端相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-10-10
  • SpringBoot框架中Mybatis-plus的簡(jiǎn)單使用操作匯總

    SpringBoot框架中Mybatis-plus的簡(jiǎn)單使用操作匯總

    這篇文章主要介紹了SpringBoot框架中Mybatis-plus的簡(jiǎn)單使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Hibernate三種狀態(tài)和Session常用的方法

    Hibernate三種狀態(tài)和Session常用的方法

    本文主要介紹了Hibernate三種狀態(tài)和Session常用的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-03-03
  • jtds1.1連接sqlserver2000測(cè)試示例

    jtds1.1連接sqlserver2000測(cè)試示例

    這篇文章主要介紹了jtds1.1連接sqlserver2000測(cè)試示例,需要的朋友可以參考下
    2014-02-02

最新評(píng)論

长春市| 韶关市| 霍林郭勒市| 安西县| 秀山| 临武县| 杨浦区| 南涧| 锦屏县| 宁乡县| 广平县| 惠州市| 应用必备| 资兴市| 稷山县| 平度市| 霍林郭勒市| 巴东县| 通州区| 安阳县| 丘北县| 河源市| 凤翔县| 九江市| 黄陵县| 慈溪市| 平塘县| 黄大仙区| 夏津县| 湖北省| 清镇市| 陇南市| 平和县| 安宁市| 聂拉木县| 汽车| 阜城县| 阜新| 桃园市| 三原县| 云龙县|