mybaits 在if-test判断数字、数字型字符串等注意事项

mybatis 判断 if 标签里的test值可见mybatis源码  

  IfSqlNode -> apply() 方法

追踪源码可知,最终是通过OGNL类判断的,所以我们可以看 

OgnlOps.equal( v1, v2 )

个人总结如下
OGNL的比较逻辑,是以转为数字为核心,它会尝试将 value转为数字
具体规则如下
  如果为Integer,Double等直接是数字,
  如果俩者都是数字型,则比较值的大小 例如 1==1.00 是true
  如果都不是数值型,并且 不是都继承了 Comparable,则通过 equals比较
  如果都不是数值型,并且继承了Comparable,或者为枚举型,则通过compareTo 比较
  否则,一个数值型,一个不是,则会尝试将非数值型转为数值,
    如果是 boolean型,true为1,false为0
    如果是单引号,'12' 里面的长度为0,则返回值为0;长度为1,则为char,长度大于1 则为 string
      如果是 char,它会通过 asii 码转为 double(ps '1' asii码为49,' ' 空格 asii码为32)
      如果是string,这尝试转为数值,无法转换,则false,否则,进行数值比较
    如果是双引号,则视为字符串 "1",则会被转为数值 1,
    char型,也可以通过 '1'.toString() 来转为字符串

 

posted @ 2017-09-28 10:30  IT新手村  阅读(1658)  评论(0编辑  收藏  举报