在工作中一直使用mybatis 来做 orm框架,但是第一次遇到了一个比较奇葩的问题。
问题场景复现 插入一个帖子,其中有个字段是否匿名 is_anonymous 在oracle表中 是 is_anonymous number default -1。然后 我就根据前台是否传Integer类型的 isAonymous 字段来确定sql中是否需要传is_anonymous字段
insert into msg_t(
id,
<if test="isAnonymous!=null and isAnonymous!=''">
is_anonymous
</if>
)values(
1,
<if test="isAnonymous!=null and isAnonymous!=''">
#{isAnonymous,jdbcType=NUMBERIC}
</if>
)
当我前台传 的参数是:
{
"isAnonymous":0
}
结果发现数据库里 新插入记录的 is_anonymous=-1, 按照前面的条件判断语句推理 is_anonymou=0 才是正确的。
开始怀疑if判断语句,但怎么看这个语句都是正确的,然后各种怀疑人生,无奈我又按照如下方法:
insert into msg_t(
id,
<if test="isAnonymous ==0">
is_anonymous
</if>
)values(
<if test="isAnonymous ==0">
#{isAnonymous,jdbcType=NUMBERIC}
</if>
)
结果发现 数据库中记录的is_anonymou=0 ,然后我就大胆推测这应该是mybatis的一个bug吧,然后上百度发现这是一个未解之谜。但是网上有博客是这样写的:
insert into msg_t(
id,
<if test="isAnonymous!=null and isAnonymous!='' or isAnonymous==0">
is_anonymous
</if>
)values(
1,
<if test="isAnonymous!=null and isAnonymous !='' or isAnonymous==0">
#{isAnonymous,jdbcType=NUMBERIC}
</if>
)
这个真的是一个坑,按照道理来说 Integer类型的 isAnonymous !=null这个判断为null写法是没有问题的,但是mybatis 就是不走这个if判断,这是为什么呢?元芳你怎么看。