在做一个删除操作时,需要更新关联表的统计记录数,当所有记录都被删除,即记录数 num 为 0 时,报错 SQLSyntaxErrorException,后面的的 sql 显示为 update table_name where id = 1,缺少了 num 字段设置。

调试统计 num = 0 参数正常传递进入到 Mapper。查看执行更新操作的 sql:

update table_name
<trim prefix="SET" suffixOverrides=",">

...
<if test="num != null and num != ''">num = #{num},</if>
...

</trim>
where id = #{id}
...

有个比较可疑的点就是 num != '' 判断,因为 num 是 Integer 类型,如果作为正常 Java 语句执行是会报错的:

Main.java:3: error: bad operand types for binary operator '!='
        System.out.println(0 != "");
                             ^
  first type:  int
  second type: String
1 error

但是在 Mybatis 里面没有报错,测试去除掉 num != '' 判断可以解决问题

百度了解到,Mybatis test 判断条件中如果是数字类型(Integer、Float、Double)与字符串比较,是会统一转化为 double 进行比较的,值都会变成 0.0。这就是 test 判断为 false 的原因。