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

MyBatis動態(tài)<if>標簽使用避坑指南

 更新時間:2023年03月07日 09:18:16   作者:半夏之沫  
這篇文章主要為大家介紹了MyBatis動態(tài)<if>標簽使用避坑指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

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

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

MyBatis版本:3.5.6

正文

一. if標簽判斷字符串

查詢參數(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或者空串),不為空時,為WHERE子句添加額外的條件。

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

正確寫法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>

注意''單引號中一定需要是多個字符,如果只有一個字符,會報錯。

正確寫法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>

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

推薦寫法

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

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

特別注意:錯誤寫法

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

這種寫法會報錯,因為像'A'這種單個字符的情況會被判定為字符,所以MyBatis認為字符串在與字符做比較,從而報錯。但是如果是'AA'或者'A'.toString() 這種,就會被判定為字符串,就正常。

二. if標簽判斷數(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>標簽也可以對數(shù)字判空,同時<if>標簽也可以判斷數(shù)字的值,這里有多種寫法,下面給出正確寫法,推薦寫法和錯誤寫法。

正確寫法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>

注意''單引號中一定需要是多個數(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>

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

正確寫法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>

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

錯誤寫法

<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'這種單個數(shù)字會被判定為字符,而字符'0'的ASCII值是48,所以times為49及以上時,才滿足times > '0',所以這里有坑,切記。

總結(jié)

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

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

而在OGNL表達式中,如果單引號''中只有一個數(shù)字或者字母,那么就會被解析為字符,這時就會導致MyBatis或者比較結(jié)果錯誤。

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

以上就是MyBatis動態(tài)&lt;if&gt;標簽使用避坑指南的詳細內(nèi)容,更多關(guān)于MyBatis動態(tài)&lt;if&gt;標簽的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mybatis動態(tài)SQL?foreach批量操作方法

    Mybatis動態(tài)SQL?foreach批量操作方法

    這篇文章主要介紹了Mybatis動態(tài)SQL?foreach批量操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean

    Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean

    這篇文章主要介紹了Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean,每個用戶有自己特有的一個實例,在用戶的生存期內(nèi),bean保持了用戶的信息,下面來了解有狀態(tài)和無狀態(tài)的區(qū)別吧
    2022-01-01
  • Java數(shù)據(jù)結(jié)構(gòu)之圖的基礎(chǔ)概念和數(shù)據(jù)模型詳解

    Java數(shù)據(jù)結(jié)構(gòu)之圖的基礎(chǔ)概念和數(shù)據(jù)模型詳解

    在現(xiàn)實生活中,有許多應(yīng)用場景會包含很多點以及點點之間的連接,而這些應(yīng)用場景我們都可以用即將要學習的圖這種數(shù)據(jù)結(jié)構(gòu)去解決。本文主要介紹了圖的基礎(chǔ)概念和數(shù)據(jù)模型,感興趣的可以了解一下
    2022-11-11
  • Java使用Runnable接口創(chuàng)建線程的示例代碼

    Java使用Runnable接口創(chuàng)建線程的示例代碼

    在Java中,多線程編程是實現(xiàn)并發(fā)操作的重要手段之一,通過多線程,程序可以同時執(zhí)行多個任務(wù),從而提高應(yīng)用程序的效率和響應(yīng)速度,Java提供了多種創(chuàng)建線程的方式,其中實現(xiàn)Runnable接口是最常見且推薦的方式之一,本文將詳細介紹如何使用Runnable接口創(chuàng)建線程
    2025-02-02
  • java進制轉(zhuǎn)換工具類實現(xiàn)減少參數(shù)長度

    java進制轉(zhuǎn)換工具類實現(xiàn)減少參數(shù)長度

    這篇文章主要為大家介紹了java進制轉(zhuǎn)換工具類實現(xiàn)減少參數(shù)長度示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • springboot升級到j(luò)dk21最新教程(2023年)

    springboot升級到j(luò)dk21最新教程(2023年)

    你還在使用jdk8?快來看看最新出爐的SpringBoot+jdk21如何使用,下面這篇文章主要給大家介紹了關(guān)于springboot升級到j(luò)dk21的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • Map集合中獲取key-value值的實現(xiàn)方法

    Map集合中獲取key-value值的實現(xiàn)方法

    這篇文章主要介紹了Map集合中獲取key-value值的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 九個動畫組圖輪播總結(jié)全棧數(shù)據(jù)結(jié)構(gòu)數(shù)組鏈表

    九個動畫組圖輪播總結(jié)全棧數(shù)據(jù)結(jié)構(gòu)數(shù)組鏈表

    數(shù)據(jù)結(jié)構(gòu)和算法是密不可分的,兩者往往是相輔相成的存在,所以在學習數(shù)據(jù)結(jié)構(gòu)過程中,不免會遇到各種算法,數(shù)據(jù)結(jié)構(gòu)常用操作一般為:增刪改查?;旧纤械臄?shù)據(jù)結(jié)構(gòu)都是圍繞這幾個操作進行展開,本文用九張動圖來闡述先進后出的數(shù)據(jù)結(jié)構(gòu)
    2021-08-08
  • Java使用@Retryable注解實現(xiàn)HTTP請求重試

    Java使用@Retryable注解實現(xiàn)HTTP請求重試

    HTTP調(diào)用是Java應(yīng)用與外部API進行交互時重要的訪問方式之一,為了確保在遇到臨時性問題時能自動重試,我們可以設(shè)計一個靈活的重試機制,在Java中,我們可以通過注解來實現(xiàn)這一功能,文將介紹如何使用注解@Retryable來實現(xiàn)HTTP調(diào)用的重試機制,需要的朋友可以參考下
    2024-10-10
  • Maven的pom.xml文件結(jié)構(gòu)中的build

    Maven的pom.xml文件結(jié)構(gòu)中的build

    本文主要介紹了Maven的pom.xml文件結(jié)構(gòu)中的build,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07

最新評論

海兴县| 岳西县| 玉环县| 宁德市| 抚顺县| 三亚市| 沙雅县| 广州市| 大宁县| 郑州市| 来宾市| 额济纳旗| 武鸣县| 和平县| 井研县| 家居| 卓资县| 三门县| 榆社县| 昌黎县| 德令哈市| 额敏县| 故城县| 巩义市| 惠东县| 长葛市| 九江县| 沙坪坝区| 二连浩特市| 紫金县| 天台县| 乌兰县| 兖州市| 寿光市| 徐水县| 沁阳市| 织金县| 普定县| 济源市| 陵川县| 汉川市|