概述

  mybatis使用xml过程中我们经常会遇到要进行动态sql的判断,如使用if标签和choose标签中的when标签,都会遇到test条件判断,test的条件判断采用的ognl语句。

  我遇到的坑是这样的:

<select id="myFunction">select * from student where 1=1<if test="status!=null and status!='' and status==0">and 2=2</if><if test="status!=null and status!='' and status!=0">and 3=3</if>
</select>

然后当 status=1的时候程序能狗正常运行并添加条件,但是当 status=0的时候死活无法进入第一个条件判断(当时改变了多种写法都不行,当时心中千万个草泥马就过去了)。

问题原因

  最后一直跟踪查找原因,终于找到了错误的地方,以及出处。原因就是如下语句:

status!=null and status!=‘’ and status==0

是不成立的,因为status是Integer类型,当进行status!=null和status==0的判断都是没有问题的,但是在判断status!='‘的时候问题就来了,既然这个属性字段是Integer类型如何进行字符串的判空呢?

  看这个断点截图,当status参数为0的时候进行判断status!=’‘的判断的时候进入这个位置,由断点的位置可以知道,需要比较的是 0 和 ’‘是否相等,但是这两个数据连类型都不同怎么能相等呢,但是mybatis进行了转换比较,但你的参数类型是不是基础数据类型以及其包装类的时候,他会把你的这个空进行如下转换:

  由这个图我们知道,最后这个0被转换为 0.0 ,而这个 ’‘ 被转换为0.0,也就是说这个时候的判断就变成了0.0与0.0的判断。所以最后在test语句中判断参数值如下

0==’‘ //是成立的

就是成立的。

  也就说当我们的status=0的时候进行test的参数判断:

status!=null and status!=‘’ and status==0

就变成了

status!=null and status!=0 and status==0

所以这个判断语句永远都不可能成立。

问题解决

  既然我们知道了原因,那么解决方案就是写判断语句ognl的时候一定要按照数据类型进行,不要写不属于该参数类型的判断方式。如下:

status!=null and status==0

这样就可以了。

mybatis的test坑(不等于‘‘ 且 不等于0)相关推荐

  1. Mybatis的逆向工程,MySQL8的数据库,8.0.11驱动的逆向工程的坑的解决方法

    Mybatis的逆向工程,MySQL8的数据库,8.0.11驱动的逆向工程的坑的解决方法 参考文章: (1)Mybatis的逆向工程,MySQL8的数据库,8.0.11驱动的逆向工程的坑的解决方法 ( ...

  2. 这些年我踩过的`Mybatis`代码生成的坑

    这些年我踩过的Mybatis代码生成的坑 原谅我不成熟的想法,因为selectByExample真香 文章目录 这些年我踩过的`Mybatis`代码生成的坑 `Mybatis`代码生成工具 安装 配置 ...

  3. Mybatis 中 sql 之 大于,等于,不等于...

    Mybatis sql语句不等于的表示 如果直接写 1 select * from user where id <> 217; mybatis就会报语法错误,<>特殊字符需要转 ...

  4. Mybatis中的SQL语句等于、不等于和模糊查询的语法

    Mybatis中的mapper文件SQL语句 转义字符 等于 = = (等于) 大于 > > (大于) 小于 < < (小于) 不等于 <> <>(不等 ...

  5. erlang精要(4)-等于与不等于

    3> 5=:=5.0. false 4> 5==5.0. true 5> 5/=4. true 6> 5=/=4. true 7> 5=:=5.0. false 8> ...

  6. goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.6:generate failed: Index: 0, Size: 0

    大家好,我是烤鸭: 报错信息如下: Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.6: ...

  7. mysql 等于_mysql 不等于 符号写法

    经过测试发现mysql中用<>与!=都是可以的,但sqlserver中不识别!=,所以建议用<> selece * from jb51 where id<>45 s ...

  8. shell脚本中判断大于、小于、等于、不等于的符号

    shell脚本中判断大于.小于.等于.不等于的符号 在shell中有时候会用到对数字进行判断的场景,尤其在写脚本判断参数的时候,以下有几个命令需要记住 大于 -gt (greater than) 小于 ...

  9. R语言逻辑运算符(Logical Operators,大于、小于、等于、不等于、与或非、是否为真)、R语言逻辑运算符(Logical Operators)实战示例

    R语言逻辑运算符(Logical Operators,大于.小于.等于.不等于.与或非.是否为真.>.<.!=.==.&.|.!&&.||).R语言逻辑运算符(Lo ...

  10. mysql不等于null和等于null的写法

    1.表结构 2.表数据  3.查询teacher_name字段不能等于空并且也不能等于空字符 SELECT * FROM sys_teacher WHERE teacher_name IS NOT N ...

最新文章

  1. sql server 2005 学习心得(select查询语句用法)
  2. RUNNING JUPYTER NOTEBOOKS ON A REMOTE SERVER VIA SSH
  3. leetcode 646. Maximum Length of Pair Chain | 646. 最长数对链(暴力递归->傻缓存->dp)
  4. pb9数据窗口中显示行数据与当前行区别_Hive的窗口函数
  5. 初学者最常问的几个问题
  6. 高等数学同济第七版上册电子版_高等数学同济第七版(上册)第一章答案
  7. NameError: name ‘__file__‘ is not defined的问题原因及解决方法
  8. skip-grant-tables:非常有用的mysql启动参数
  9. python多线程爬虫界面_Python实现贴吧多线程网盘爬虫
  10. 问题三:类的头文件和实现文件分别写什么(用向量表示RGB输出“第一张图片”)
  11. halcon学习之边缘检测
  12. ERP系统设计:库存管理怎么做?
  13. 【深度学习--图像分类】imageAI自定义模型训练
  14. Vscode 如何配置debug
  15. docker防止fork炸弹
  16. 设计模式 ---建造者模式
  17. SIR传染模型Matlab代码,sir传染病模型 MATLAB代码运行不了,
  18. linux 中 查看防火墙开放端口号 命令
  19. 微信已经成为电商最重要的一个通道
  20. tomcat报错405

热门文章

  1. pyecharts绘画优美图形之一:最全地图
  2. C#宝石闪电战【高仿,推荐】
  3. 解决360浏览器自动填充的屎黄色背景的问题
  4. 应用程序0xc000005解决办法
  5. css里面的after_CSS中的after
  6. 国际象棋马互相攻击问题
  7. 学校图文店打印价格低质量好吗
  8. 内存不能read 解决办法
  9. java计算机毕业设计宠物店管理系统MyBatis+系统+LW文档+源码+调试部署
  10. 全面分析反应釜的防腐问题和清洗