Mybatis的动态SQL中遇到关于什么时候加!=""的问题

问题描述:Mybatis中动态SQL为什么要加!="",什么时候要加!=""

bug触发方式:当变量为数值类型时,输入0来测试,即用数值类型的0来测试
为什么要加!=""?
Java中String类型的变量有三种状态:

  1. null:变量未初始化,指向空引用
  2. "":空字符串(长度为0的字符串),变量有引用但是无内容
  3. 0:字符串形式的数字0(若变量是数值类型为数值0)

Mybatis的<if test>中,只判断a != null无法过滤空字符串。如果前端传入空字符串(""),会导致SQL拼接出a='',这不期望结果 所以需要加入!=""来同时过滤null和空字符串("")
0测试的场景(主要目的是验证当变量值为0或者为"0"时,条件是否生效

场景1:变量为String类型的0

a = "0",条件a !=0 and a != ""true(条件生效)
a = ""null时,条件为false(条件不生效)

<select id="test" resultType="java.lang.String">
    SELECT 1 FROM book
    <where>
        <if test="a != null and a != ''">
            AND a = #{a}
        </if>
    </where>
</select>
  • 测试1:传入a = null->条件不拼接->SQL:SELECT 1 FROM book
  • 测试2:传入a = ""->条件不拼接->SQL:SELECT 1 FROM book
  • 测试3:传入a = "0"->条件拼接->SQL:SELECT 1 FROM book WHERE a = '0(符合预期)

场景2:变量为int/Integer的0

如果a是数值类型,此时!=""会因为Mybatis的OGNL表达式的自动类型转换(数值和字符串比较)导致无效

<!-- 错误写法:a 是 Integer 类型,值为0时,条件不生效,因为 0 != "" → false -->
<if test="a != null and a != ''">
    AND a = #{a}
</if>
<!-- 正确写法:数值类型只需判断 != null 即可 -->
<if test="a.trim() != null">
    AND a = #{a}
</if>

总结:加!=""的场景

变量类型 是否需要加 != "" 核心原因
String 过滤空字符串(""),避免拼接 a= '' 这类无业务意义的无效条件
数值类型(int/Integer/Long) 数值与字符串比较会触发类型转换(如 0 != "" 解析为 false),误过滤合法的0值
其他类型(Date/Boolean等) 仅存在 null 状态,无空字符串场景,加 != "" 无意义且可能引发类型错误
posted on 2025-12-25 16:21  红皮烤肠超人  阅读(4)  评论(0)    收藏  举报