温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

mybatis的test坑怎么解决

发布时间:2023-03-30 17:16:46 来源:亿速云 阅读:105 作者:iii 栏目:开发技术

今天小编给大家分享一下mybatis的test坑怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

概述

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!='&lsquo;的时候问题就来了,既然这个属性字段是Integer类型如何进行字符串的判空呢?

mybatis的test坑怎么解决

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

mybatis的test坑怎么解决

由这个图我们知道,最后这个0被转换为 0.0 ,而这个 &rsquo;&lsquo; 被转换为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坑怎么解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI