" />

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

MyBatis動(dòng)態(tài)<if>標(biāo)簽的使用

 更新時(shí)間:2023年05月11日 10:46:44   作者:半夏之沫  
本文主要介紹了MyBatis動(dòng)態(tài)<if>標(biāo)簽的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

MyBatis中的<if>動(dòng)態(tài)SQL標(biāo)簽,常用場(chǎng)景是根據(jù)條件添加WHERE子句。本篇文章將對(duì)<if>動(dòng)態(tài)SQL標(biāo)簽使用中的常見問題進(jìn)行演示和總結(jié)。

演示的場(chǎng)景有:if判斷字符串if判斷數(shù)字。

MyBatis版本:3.5.6

正文

一. if標(biāo)簽判斷字符串

查詢參數(shù)Param如下。

public class Param {
    private int id;
    private String level;
    private int times;
    private String timestamp;
    // 省略get和set
}

語句如下。

<select id="queryEvents" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE id=#{id}
    <if test="level != null and level != ''">
        AND e_level=#{level}
    </if>
</select>

上述是判斷字符串是否為空(null或者空串),不為空時(shí),為WHERE子句添加額外的條件。

通過<if>標(biāo)簽判斷字符串是否為空,是<if>標(biāo)簽使用頻率最高的用法,但是有時(shí)也會(huì)通過<if>標(biāo)簽來判斷字符串的值,這里有多種寫法,下面給出正確寫法推薦寫法錯(cuò)誤寫法。

正確寫法1

<select id="queryEvents" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE id=#{id}
    <if test="level == 'secondary'">
        AND e_times>10
    </if>
</select>

注意''單引號(hào)中一定需要是多個(gè)字符,如果只有一個(gè)字符,會(huì)報(bào)錯(cuò)。

正確寫法2

<select id="queryEvents" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE id=#{id}
    <if test="level == 'secondary'.toString()">
        AND e_times>10
    </if>
</select>

這種寫法不限制''單引號(hào)中的字符個(gè)數(shù),一個(gè)或多個(gè)都可以。

推薦寫法

<select id="queryEvents" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE id=#{id}
    <if test='level == "secondary"'>
        AND e_times>10
    </if>
</select>

推薦外層用單引號(hào),內(nèi)層用雙引號(hào)的寫法,能少踩很多坑

特別注意:錯(cuò)誤寫法

<select id="queryEvents" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE id=#{id}
    <if test="level == 'A'">
        AND e_times>10
    </if>
</select>

這種寫法會(huì)報(bào)錯(cuò),因?yàn)橄?#39;A'這種單個(gè)字符的情況會(huì)被判定為字符,所以MyBatis認(rèn)為字符串在與字符做比較,從而報(bào)錯(cuò)。但是如果是'AA'或者'A'.toString() 這種,就會(huì)被判定為字符串,就正常。

二. if標(biāo)簽判斷數(shù)字

查詢參數(shù)Param如下。

public class Param {
    private int id;
    private String level;
    private int times;
    private String timestamp;
    // 省略get和set
}

語句如下。

<select id="queryEvents3" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE e_level=#{level}
    <if test="times != null">
        AND e_times>#{times}
    </if>
</select>

通過<if>標(biāo)簽也可以對(duì)數(shù)字判空,同時(shí)<if>標(biāo)簽也可以判斷數(shù)字的值,這里有多種寫法,下面給出正確寫法,推薦寫法和錯(cuò)誤寫法。

正確寫法1

<select id="queryEvents2" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE e_level=#{level}
    <if test="times > '10'">
        AND e_times>#{times}
    </if>
</select>

注意''單引號(hào)中一定需要是多個(gè)數(shù)字。

正確寫法2

<select id="queryEvents2" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE e_level=#{level}
    <if test="times > '0'.toString()">
        AND e_times>#{times}
    </if>
</select>

這種寫法不限制''單引號(hào)中的數(shù)字個(gè)數(shù),一個(gè)或多個(gè)都可以。

正確寫法3

<select id="queryEvents" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE e_level=#{level}
    <if test="times > 0">
        AND e_times>#{times}
    </if>
</select>

判斷條件可以直接寫數(shù)字。

推薦寫法

<select id="queryEvents2" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE e_level=#{level}
    <if test='times > "0"'>
        AND e_times>#{times}
    </if>
</select>

推薦外層用單引號(hào),內(nèi)層用雙引號(hào)的寫法,能少踩很多坑

錯(cuò)誤寫法

<select id="queryEvents" resultMap="eventResultMap">
    SELECT
        id,
        e_name,
        e_times,
        e_level
    FROM event
    WHERE e_level=#{level}
    <if test="times > '0'">
        AND e_times>#{times}
    </if>
</select>

'0'這種單個(gè)數(shù)字會(huì)被判定為字符,而字符'0'的ASCII值是48,所以times為49及以上時(shí),才滿足times > '0',所以這里有坑,切記。

總結(jié)

<if>標(biāo)簽的test判斷中,外層用雙引號(hào),內(nèi)層用單引號(hào)時(shí),有如下比較規(guī)則。

  • 允許數(shù)字與字符串做比較;
  • 允許數(shù)字與字符做比較,但不推薦。數(shù)字與字符做比較時(shí),數(shù)字會(huì)與字符的ASCAII值做比較,容易出錯(cuò);
  • 不允許包含字母的字符串與字符做比較。這種情況MyBatis會(huì)直接報(bào)錯(cuò);
  • 允許全是數(shù)字的字符串與字符做比較,但不推薦。這種情況全是數(shù)字的字符串會(huì)作為數(shù)字來與字符的ASCII值來做比較,容易出錯(cuò)。

而在OGNL表達(dá)式中,如果單引號(hào)''中只有一個(gè)數(shù)字或者字母,那么就會(huì)被解析為字符,這時(shí)就會(huì)導(dǎo)致MyBatis或者比較結(jié)果錯(cuò)誤。

因此推薦<if>標(biāo)簽的test判斷中,外層用單引號(hào),內(nèi)層用雙引號(hào),能夠避免踩坑。

到此這篇關(guān)于MyBatis動(dòng)態(tài)<if>標(biāo)簽的使用的文章就介紹到這了,更多相關(guān)MyBatis動(dòng)態(tài)<if>標(biāo)簽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring?eurake中使用IP注冊(cè)及問題小結(jié)

    spring?eurake中使用IP注冊(cè)及問題小結(jié)

    在開發(fā)spring?cloud的時(shí)候遇到一個(gè)很奇葩的問題,就是服務(wù)向spring?eureka中注冊(cè)實(shí)例的時(shí)候使用的是機(jī)器名,然后出現(xiàn)localhost、xxx.xx等這樣的內(nèi)容,這篇文章主要介紹了spring?eurake中使用IP注冊(cè),需要的朋友可以參考下
    2023-07-07
  • 使用bat啟動(dòng)springboot項(xiàng)目并解決亂碼問題

    使用bat啟動(dòng)springboot項(xiàng)目并解決亂碼問題

    這篇文章主要介紹了window中使用bat啟動(dòng)springboot項(xiàng)目,并解決亂碼問題
    2021-06-06
  • JAVA觀察者模式的的講解及代碼實(shí)現(xiàn)

    JAVA觀察者模式的的講解及代碼實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了JAVA的觀察者模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 四步五分鐘Spring4快速集成Swagger

    四步五分鐘Spring4快速集成Swagger

    這篇文章主要為大家詳細(xì)介紹了四步、五分鐘Spring4快速集成Swagger的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java中繼承thread類與實(shí)現(xiàn)Runnable接口的比較

    Java中繼承thread類與實(shí)現(xiàn)Runnable接口的比較

    這篇文章主要介紹了Java中繼承thread類與實(shí)現(xiàn)Runnable接口的比較的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • java 線程鎖詳細(xì)介紹及實(shí)例代碼

    java 線程鎖詳細(xì)介紹及實(shí)例代碼

    這篇文章主要介紹了java 線程鎖詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 解決@Autowired注入static接口的問題

    解決@Autowired注入static接口的問題

    這篇文章主要介紹了解決@Autowired注入static接口的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Springboot集成mqtt客戶端詳解

    Springboot集成mqtt客戶端詳解

    MQTT是一個(gè)基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議。MQTT協(xié)議是輕量、簡(jiǎn)單、開放和易于實(shí)現(xiàn)的,這些特點(diǎn)使它適用范圍非常廣泛。本文為大家分享了Springboot整合mqtt服務(wù)的示例代碼,需要的可以參考一下
    2022-10-10
  • springboot+jersey+tomcat實(shí)現(xiàn)跨域方式上傳文件到服務(wù)器的方式

    springboot+jersey+tomcat實(shí)現(xiàn)跨域方式上傳文件到服務(wù)器的方式

    這篇文章主要介紹了springboot+jersey+tomcat實(shí)現(xiàn)跨域方式上傳文件到服務(wù)器,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • druid多數(shù)據(jù)源配置+Datasurce動(dòng)態(tài)切換方式

    druid多數(shù)據(jù)源配置+Datasurce動(dòng)態(tài)切換方式

    這篇文章主要介紹了druid多數(shù)據(jù)源配置+Datasurce動(dòng)態(tài)切換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論