背景
mybatis判断中,会将空字符串与0判断为相等,意识不到这个问题,很有可能会踩坑。
问题现象
<update id="updateOne" parameterType="com.inspur.search.data.EntityRelation">
UPDATE ENTITY_RELATION
<set>
<if test="srcId!=null and srcId != ''">
SRC_ID=#{srcId}
</if>
</set>
WHERE id=#{id}
</update>
按照上述写法,大家意向中,如果srcId为0,则update 会正常执行。
但是mybatis不这么认为,sql语法会报错,没有需要set的值
如下:
UPDATE ENTITY_RELATION where id=#{id}
问题定位
怀疑mybatis将0识别为空字符串,导致if条件为false,从而不拼接set语句。
原因分析
mybaits解析的所有sqlNode节点,针对if节点会交给ifSqlNode来处理,最终都会调用OgnIOPs.class类的doubleValue(Object value)方法。
mybatis除将0识别为空字符串,还会将空字符串识别为0
如下:会判断字符串长度,如果长度为0,则转为0
解决方法
更换if 写法
<update id="updateOne" parameterType="com.inspur.search.data.EntityRelation">
UPDATE ENTITY_RELATION
<set>
<if test="(srcId!=null and srcId != '') or srcId == 0">
SRC_ID=#{srcId}
</if>
</set>
WHERE id=#{id}