当前位置: 首页 > news >正文

mybatis的test坑(不等于‘‘ 且 不等于0)

概述

  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

这样就可以了。

相关文章:

  • 使用IDEA快速部署到Docker云端
  • 全志T507 UART复用方法-飞凌嵌入式知识库
  • 【机器学习】过拟合和欠拟合怎么判断,如何解决?(面试回答)
  • 2022年数模国赛冲刺之模型复习2
  • 程序包lombok不存在,纠正网上错误答案
  • css知识点总结
  • 【Rust日报】2022-08-29 RLS 谢幕
  • 【Python黑科技】图片太大不能上传?三种压缩图片大小的方法(代码注释详细)
  • hadoop生态圈面试精华之Yarn
  • 阿里云:加大NoSQL数据库软硬件一体化技术自研
  • 机构用户注册/登录的设计
  • 面向对象-多态
  • C语言高级教程-C语言数组(二)
  • 【JS】JavaScript入门笔记第三弹~
  • 关于写文章怎样才能制作出优质封面?看完这篇博客就够了(数千字手把手教学)
  • 3.7、@ResponseBody 和 @RestController
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • exif信息对照
  • Laravel 实践之路: 数据库迁移与数据填充
  • Linux gpio口使用方法
  • node学习系列之简单文件上传
  • 订阅Forge Viewer所有的事件
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 入口文件开始,分析Vue源码实现
  • 什么是Javascript函数节流?
  • 提醒我喝水chrome插件开发指南
  • 一道闭包题引发的思考
  • const的用法,特别是用在函数前面与后面的区别
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • ###C语言程序设计-----C语言学习(3)#
  • #define
  • #QT(一种朴素的计算器实现方法)
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (C语言)共用体union的用法举例
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (MATLAB)第五章-矩阵运算
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (三)docker:Dockerfile构建容器运行jar包
  • (十一)c52学习之旅-动态数码管
  • (四)模仿学习-完成后台管理页面查询
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转载)Google Chrome调试JS
  • **python多态
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .net CHARTING图表控件下载地址
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • @Autowired和@Resource装配
  • @media screen 针对不同移动设备
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C/C++]数据结构 栈和队列()