欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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ù)字或者字母,那么就會被解析為字符,這時就會導(dǎo)致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)文章

  • 通過Java實現(xiàn)在Word中創(chuàng)建可填充表單

    通過Java實現(xiàn)在Word中創(chuàng)建可填充表單

    這篇文章主要為大家詳細介紹了如何通過Java代碼,以編程方式在Word中創(chuàng)建可填充表單,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-03-03
  • Tomcat正常啟動,訪問所有頁面均報404異常,404異??偨Y(jié)分析

    Tomcat正常啟動,訪問所有頁面均報404異常,404異??偨Y(jié)分析

    今天遇到一個問題:Tomcat正常啟動,訪問所有頁面均報404異常,究竟該如何解決這個問題呢?下邊小編將為大家介紹一下解決方法,需要的朋友可以參考下
    2013-07-07
  • Java并發(fā)編程之詳解CyclicBarrier線程同步

    Java并發(fā)編程之詳解CyclicBarrier線程同步

    在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文為系列文章第十篇,需要的朋友可以參考下
    2021-06-06
  • Java利用跳躍表解決雙重隊列問題詳解

    Java利用跳躍表解決雙重隊列問題詳解

    這篇文章主要為大家詳細介紹了Java如何利用跳躍表來解決雙重隊列的問題。本文通過一個簡單的例題進行了講解,感興趣的小伙伴可以了解一下
    2022-12-12
  • Java中的什么場景使用遞歸,如何使用遞歸

    Java中的什么場景使用遞歸,如何使用遞歸

    這篇文章主要介紹了Java中的什么場景使用遞歸,如何使用遞歸的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 使用1招搞定maven打包空間不足的問題

    使用1招搞定maven打包空間不足的問題

    這篇文章主要介紹了使用1招搞定maven打包空間不足的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • redis分布式鎖的實現(xiàn)原理詳解

    redis分布式鎖的實現(xiàn)原理詳解

    這篇文章主要為大家詳細介紹了redis分布式鎖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • java讀取txt文件并輸出結(jié)果

    java讀取txt文件并輸出結(jié)果

    這篇文章主要介紹了java讀取txt文件并輸出結(jié)果,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Spring請求傳遞參數(shù)的解決方案

    Spring請求傳遞參數(shù)的解決方案

    訪問不同的路徑,就是發(fā)送不同的請求.在發(fā)送請求時,可能會帶?些參數(shù),所以我們在學(xué)習(xí)Spring的請求時,主要是學(xué)習(xí)如何傳遞參數(shù)到后端以及后端如何接收,下面給大家講解?Spring請求傳遞參數(shù)詳解,一起看看吧
    2024-01-01
  • java date類與string類實例代碼分享

    java date類與string類實例代碼分享

    這篇文章主要介紹了java date類與string類實例代碼分享,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論