先来看下问题,mybatis中,进行了判断,如果type为0,那么返回3条。
但实际上确返回了7条(数据库中一共只有七条数据),显然,第一个 if 标签没有生效,或者test 里面的值为false。
如下图, 入参为type=0, 返回了 7条数据
求助开源社区后,发现是 type!= '' 结果为false,也就是说这里的 0!='' 是false
原因是空字符串会转换成0
为了真正搞明白怎么回事,直接看源码。
参照大佬的总结,运行到xmltags包时,一步步进行探究
接着运行,看到对 0 和 '' 进行比较了,进到OgnlOps.equal方法里面,看看到底是怎么进行比较的。
一步步进来之后发现,发现这里是对参数进行了double转换,
0变成了0.0 而 '' 字符串也直接变成了0.0, 所以 0 跟 '' 相等!!所以 type !='' 结果是false! 这就是为什么test标签失效的原因。
为什么是转换成0 而不是其他数字呢
进到doublevalue里面继续探究一下。
如果传进来的是参数是字符串,并且长度是0,那么就会转换成 double类型的 0
解决这个问题,可以将入参参数type设置成字符串"0"