溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Mybatis的mapper.xml中if標(biāo)簽test判斷怎么使用

發(fā)布時(shí)間:2022-06-07 09:46:52 來源:億速云 閱讀:4764 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Mybatis的mapper.xml中if標(biāo)簽test判斷怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Mybatis的mapper.xml中if標(biāo)簽test判斷怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

mapper.xml中if標(biāo)簽test判斷的用法

1. 字符串等于條件的兩種寫法

① 將雙引號(hào)和單引號(hào)的位置互換

<if test=' testString != null and testString == "A" '>
   AND 表字段 = #{testString}
</if>

② 加上.toString()

<if test=" testString != null and testString == 'A'.toString() ">
  AND 表字段 = #{testString}
</if>

2. 非空條件的判斷

長久以來,我們判斷非空非null的判斷條件都是如下所示:

<if test="xxx !=null and xxx !=''">

但是這樣的判斷只是針對(duì)String的,如果是別的類型,這個(gè)條件就不一定成立了,比如最經(jīng)典的:當(dāng)是數(shù)字0時(shí),這個(gè)判斷就會(huì)把0過濾掉,所以如果要判斷數(shù)字,我們一般會(huì)再加上一個(gè)0的判斷(這和mybatis的源碼邏輯有關(guān),有興趣的可以去看看源碼)

<if test="xxx !=null and xxx !='' or xxx == 0">

但是如果傳進(jìn)來的是數(shù)組或者集合呢?我們要再寫別的判斷嗎?能不能封裝個(gè)方法呢?

答案是可以的。

if標(biāo)簽里面的test判斷是可以使用工具類來做判斷的,畢竟test后面跟的也是一個(gè)布爾值,其用法是:

<if test="@完整的包名類名@方法名(傳參)">

例如:

<if test="@com.xxx.util.MybatisTestUtil@isNotEmpty(obj)">

下面是我寫的一個(gè)簡陋的工具類,不是很全面,拋磚引玉,各位可以根據(jù)需要補(bǔ)充。

import java.util.Collection;
import java.util.Map;
/**
 * @description: mybatis的<if test="">標(biāo)簽中使用的非空判斷工具類
 *      使用方式:<if test="@com.xxx.xxx.util.MybatisTsetUtil@isNotEmpty(obj)">
 * @author: singleDog
 * @date: 2020/7/20
 */
public class MybatisTestUtil {
    public static boolean isEmpty(Object o) {
        if (o == null) {
            return true;
        }
        if (o instanceof String) {
            return ((String) o).trim().length() == 0;
        } else if (o instanceof Collection) {
            return ((Collection) o).isEmpty();
        } else if (o instanceof Map) {
            return ((Map) o).isEmpty();
        } else if (o.getClass().isArray()) {
            return ((Object[]) o).length == 0;
        } else {
            return false;
        }
    }
    public static boolean isNotEmpty(Object o) {
        return !isEmpty(o);
    }
}

3. 判斷數(shù)組是否包含某個(gè)元素

<if test="list.contains(xxx)">
    //...
</if>

注意,元素類型是字符串的話,參考1中的寫法,一般這樣寫

<!--包含-->
<if test="list.contains('示例元素'.toString())">
    //...
</if>

<!--不包含-->
<if test="!list.contains('示例元素'.toString())">
    //...
</if>

mapper.xml <if test>書寫時(shí)候的一些坑

1. 分頁

map中添加了兩個(gè)int類型的數(shù)據(jù),

map.put("startNum",(page.getPageNum()-1)*page.getNumPerPage());
map.put("pageSize",page.getNumPerPage());

錯(cuò)誤的SQL書寫:

<if test="startNum != null  and startNum != '' ">
       LIMIT #{startNum},#{pageSize}
</if>

正確的SQL書寫

<if test="startNum != null">
       LIMIT #{startNum},#{pageSize}
</if>

因?yàn)閟tartNum里存的是int數(shù)據(jù),所以不能與空字符串進(jìn)行比較,強(qiáng)行比較時(shí)會(huì)報(bào)錯(cuò)。

2. 字符串形式的數(shù)據(jù)比較

map中添加的是一個(gè)字符串形式的“1”

map.put("uploadFlag",upload.getUploadFlag());

如果想在XML中比較,以下兩種方式都可以:

2.1 test使用雙引號(hào)

比較的對(duì)象使用單引號(hào)點(diǎn)toString()方法:

<if test="uploadFlag=='1'.toString()">
     and pw.id in (select pw_id from t_contract_upload)
</if>

2.2 test使用單引號(hào)

比較的對(duì)象直接使用雙引號(hào):

<if test='uploadFlag=="2" '>
     and pw.id in (select pw_id from t_contract_upload)
</if>

讀到這里,這篇“Mybatis的mapper.xml中if標(biāo)簽test判斷怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI