天天看點

使用動态SQL中的if标簽做條件判斷的幾種用法和注意點

使用中踩到的坑記錄一下(大神請略過,我隻是個菜菜,忽噴!!!萬分感謝!!!)

<mapper namespace="dynamic">
 
    <resultMap id="userMap" type="com.soft.test.model.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="create_date" property="createDate"/>
    </resultMap>
 
    <!--***if 标簽使用類似html的C标簽的if 在此處應該是and 或者使用or來代替&&和||*** -->
    <select id="selectUseIf" parameterType="com.soft.test.model.User" resultMap="userMap">
        select * from t_user where
        <if test="id != null and id != ''">
            id=#{id}
        </if>
        <if test="username != null and username != ''">
            and username like concat('%',#{username},'%')
        </if>
        <if test="password != null and password != ''">
            and password=#{password}
        </if>
    </select>
    
</mapper>
           

在上方代碼中可以看到要注意的點在于要使用and來代替" && "和用or來代替 " || "

mybatis的if判斷語句其實跟el表達式的if條件判斷有些類似。

例如:

1 如果參數為數字類型的時候沒有特俗需求的情況隻需要判斷是否為null即可。

例如:

如果有特俗需求,例如判斷是否大于某個數的時候才行。隻需要加上對應的條件判斷即可

例如:

mybatis對于這種大于小于等等還有另一種形式。

例如:

對應關系:

gt            對應             >

gte         對應              >=

lt             對應              <(會報錯  相關聯的 "test" 屬性值不能包含 '<' 字元)

lte          對應               <=(會報錯  相關聯的 "test" 屬性值不能包含 '<' 字元)
           

2 如果為字元串類型

2.1 如果不需要過濾空串的情況 僅僅判斷null即可

例如:

2.2 如果需要過濾空串,添加空串判斷即可 不支援 && 是以這裡用 and or || 來做邏輯與或的判斷

例如: 或者

2.3 如果判斷字元串是否已某個特俗字元開頭,結尾等。直接調用String的對應方法即可

例如:

2.4 是否是某個特定字元串,某些業務有此需要。

例如: 或者

注意:

這種形式的寫法在參數類型是字元串的時候是沒有問題的,

但是參數類型為非字元串類型的時候就需要寫成

僅僅寫成也會有很大可能會挂。

也許你會說非字元串的為什麼要寫成這樣。這就要看特俗需要了。

例如:某一個sql片段是公用的,

該片段更新條件也用,但是當你需要将某一個字段更新成null的時候怎麼辦。

這個時候就可以通過傳入一個特定的字元串來弄。當傳入的字元串為特定字元串的時候就更新該字元串為null。

xxx=null

當然這樣子貌似date型會挂。

通過 2.2 也可以看出mybatis對于字元串的相等不相等的判斷也是有對應的特俗操作符的。

eq 對應 ==

neq 對應 !=

當然還可以看出來if的條件判斷test是支援對象自身方法調用的,即使是自己寫的方法,可以自己嘗試。當然下面會有例子。

例如:裡面可以用‘xxxx’.equals(xxxx) 字元串的比較兩個字元串方法

xxxx.indexOf('ss') 判斷字元串裡面是否包含某個字元等等  
           

3 判斷list是否為空

上面說過,if條件判斷可以直接調用對象自身的方法進行邏輯判斷,是以list判空。可以調用.size()>0或者.isEmpty()

例如: ,

4 map參數同同理 取值的話 map.key(map中的key名字)即可

此文摘要:特别鳴謝sumlen