问题描述:Mybatis中动态SQL为什么要加!="",什么时候要加!=""
bug触发方式:当变量为数值类型时,输入0来测试,即用数值类型的0来测试
为什么要加!=""?
Java中String类型的变量有三种状态:
null:变量未初始化,指向空引用"":空字符串(长度为0的字符串),变量有引用但是无内容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状态,无空字符串场景,加!= ""无意义且可能引发类型错误
浙公网安备 33010602011771号