本文小编为大家详细介绍“mybatisiftest条件判断语句中的判断问题实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatisiftest条件判断语句中的判断问题实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。写这个主要是描述在mybatis中要注意的问题,很不幸,自己没注意,跳坑了。可以看到这里只是对传入参数一个简单的判断。controller层传入一个Integer类型的facilityOccupied参数。表面上看没什么问题,当传入facilityOccupied = 1,测试结果很意外,它查询了所有的结果,也就是说它没有符合这个判断facilityOccupied == 1 。换一种写法,在controller层中将传入参数facilityOccupied改为String类型的,通过查询结果可以看出它符合facilityOccupied == 1 这个判断条件。所以,总结起来怎么说,在这个地方比较的并不是数值大小,而是物理地址,这个双引号里面的1不是int类型也不是integer类型,而是String字符串类型,啊多么痛的领悟。补充一下,test中eq 和 == 效果一样,比较的是地址,所以比较值最好使用equals()。【】mybatis的if判断单个的字符要写到双引号里面才行,改为或者改为.xml文件的部分代码takeWay == “1”处出错,导致不执行if判断中的sql,运行程序不报错,没有任何提示。去掉takeWay == “1” and 则可执行。对此我百思不得其解,因为自己有写过如下代码,是没错的。把改为或改为即可。原因是:mybatis是用OGNL表达式来解析的,在OGNL的表达式中,’1’会被解析成字符,java是强类型的,char 和 一个string 会导致不等,所以if标签中的sql不会被解析。总结下使用方法:单个的字符要写到双引号里面或者使用.toString()才行!POJOMapper XML当status的值为 0时该where SQL and status = 0并未正常拼接,也就是说test内的表达式为false,从而导致查询结果错误。但是,显然该值(Integer :0)!= null也!= ‘ ‘,应该为true才对。当status为Integer类型,并且status值为0时,该if判断却为fals免费云主机域名e。当status为0时,Mybatis会解析成” 空字符串。为了避免这个问题,改成下面这样写,去掉对空字符的判断,就解决了该问题通过Debug MyBatis源码顺藤摸瓜找到了IfSqlNode类,该类用来处理动态SQL的节点,方法public boolean apply(DynamicContext context)用来构造节点内的SQL语句。if (evaluator.evaluateBoolean(test, context.getBindings())该代码便是解析test内表达式的关键,如果表达式为true则拼接SQL,否则忽略。打开ExpressionEvaluator 类,发现解析表达式使用的是OGNL,如果你使用过古老的Struts框架你应该对它不陌生。通过OgnlCache.getValue(expression, parameterObject);可以看到表达式的值是从缓存中获取的,由此可知MyBatis竟然对表达式也做了缓存,以提高性能。跟进去看看,终于找到了解析表达式的方法private static Object parseExpression(String expression),该方法会先从缓存取值,如果没有便进行解析并放入缓存中,然后调用Ognl.getValue(parseExpression(expression), root)获得表达式的值。至于Ognl.getValue(parseExpression(expression), root)是如何运作的,如果你有兴趣可以自行跟下去一探究竟,本文就不赘述了。到此为止,我们已经知道MyBatis的表达式是用OGNL处理的了,这一点已经够了。下面我们去OGNL官网看看是不是我们的表达式语法有问题从而导致该问题的发生。Interpreting Objects as BooleansAny object can be used where a boolean is required. OGNL interprets objects as booleans like this:If the object is a Boolean, its value is extracted and returned;If the object is a Number, its double-precision floating-point value is compared with zero; non-zero is treated as true, zero as false;If the object is a Character, its boolean value is true if and only if its char value is non-zero;Otherwise, its boolean value is true if and only if it is non-null.果然,如果对象是一个Number类型,值为0时将被解析为false,否则为true,浮点型0.00也是如此。OGNL对于boolean的定义和JavaScript有点像,即” == 0 == false。这也就不难理解and status = #{status}当status=0时出现的问题了,显然0!=”是不成立的,导致表达式的值为false。将表达式修改为and status = #{status}该问题便迎刃而解。该问题的根源还是来自编码的不规范,只有String类型才需要判断是否!=”,其他类型完全没有这个必要,可能是开发人员为了省事直接复制上一行拿过来改一改或是所使用的MyBatis生成工具不严谨导致该问题的发生。这里有必要再提一个“坑”,如果你有类似于String str =”A”; 这样的写法时,你要小心了。因为单引号内如果为单个字符时,OGNL将会识别为Java 中的 char类型,显然String 类型与char类型做==运算会返回false,从而导致表达式不成立。解决方法很简单,修改为即可。读到这里,这篇“mybatisiftest条件判断语句中的判断问题实例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。
相关推荐: HTML头元素是什么
这篇文章将为大家详细讲解有关HTML头元素是什么,小编觉得挺实用的免费云主机域名,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 该 head元素共同描述了文档的属性,例如标题,提供了诸如字符集之类的元信息,指示浏览器在哪里找到样式表或脚本,这…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。