mysql的if标签的字符串比较注意点

一.if 标签的普通用法

       SELECT * FROM a  where 1=1
       <if test='id != null and id != ""'>
          and id = #{id}
       </if>

代码简单讲解:

1)if标签的test属性必填,该属性值是一个符合OGNL要求的判断表达式,一般只用true或false作为结果。

2)判断条件property != null 或 property == null,适用于任何类型的字段,用于判断属性值是否为空。

3)判断条件property != "" 或 property == "",仅适用于String类型的字段,用于判断是否为空字符串。

4)当有多个判断条件时,使用and或or进行连接,嵌套的判断可以使用小括号分组,and相当于Java中的与(&&),or相关于Java中的或(||)。

所以上面代码的意思就是先判断id是否为null,然后再判断id是否为空字符串,如果不为null和空,那么就执行 id = #{id}这个条件。

二.if 标签里加变量

在if标签里,除了null和数字(如1,99,77.452)以外,只要其他的元素只要没有被""或者''包住,那么就会被看做是一个变量.

如下面的代码   id  和 uuuu都被认做是变量. mybatis会调get方法去get它们的值,

       SELECT * FROM a  where 1=1
       <if test='id != null and id != uuuu'>
          and id = #{id}
       </if>

下面的代码给id 和 uuuu 赋值.

(试验得知,给变量赋值int 类型和string类型都可以,mybatis有隐式转换,会把所有类型的值全部转换成string类型再去进行比较)

        Student stu = new Student();
        stu.setId("1");
        stu.setUuuu("2");
        List<HashMap<String, Object>> hashMaps = utimeeMapper.SelectList01(stu);

给id 赋了 "1", 给uuuu赋了 "2",  那么if标签成立, 就会去执行 id = #{id}这个条件

三.if 标签外面用双引号""包裹和用单引号''包裹的区别

情况一: 给type赋值为"1"或1.

<if test = " TYPE == '1' "> 这里的SQL并不能执行 </if>

因为 mybatis 使用的是ognl 表达式。 会把 1 解析为一个字符!!! 而不是字符串。

所以mybatis 在比较的时候一直认为字符串"1"不等于字符'1',所以结果一直都是 false。

解决办法
1、 转换为字符串进行比较


<if test = " TYPE == '1' .toString()"> 转换为字符串进行比较 </if>

2、 使用双引号 “”


<if test = ‘TYPE == "1" ’> 转换为字符串进行比较 </if>
情况二: 给type赋值为"你".
<if test = " TYPE == '你' "> 程序运行会直接报错 </if>

程序运行会直接报错For input string: "你",  意思就是char类型的'你'不能被转换成string类型. 

解决办法:if标签外层用单引号包裹

<if test = ' TYPE == "你" '> 程序正常运行可以进来 </if>

总结,如果遇到<if>标签里面要判断字符串比较的,那么建议采用第二种方法,就是最外面使用单引号

因此,建议用if标签的时候外面全部选择用单引号包裹.省事多了. 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值