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

专业做效果图网站重庆seo培训

专业做效果图网站,重庆seo培训,门户网站建设和推广,网站路径301重定向怎么做文章目录 前言一、场景如下二、原因分析1. 源码分析2. 写代码验证 三、解决办法代码及执行结果如下 总结 前言 在开发过程中遇到MyBatis的动态SQL的if条件不生效的情况,但经过debuger发现并不是参数问题,已经拿到了参数并传给了MyBatis,且从表…

文章目录

  • 前言
  • 一、场景如下
  • 二、原因分析
    • 1. 源码分析
    • 2. 写代码验证
  • 三、解决办法
    • 代码及执行结果如下
  • 总结


前言

  在开发过程中遇到MyBatis的动态SQL的if条件不生效的情况,但经过debuger发现并不是参数问题,已经拿到了参数并传给了MyBatis,且从表达式来看是为true的,那么为什么不生效呢?


一、场景如下

  1. mapper.xml代码:

在这里插入图片描述

  1. 模拟Service代码

在这里插入图片描述
按照传入的条件subsidySum为0,那么对于<if test="subsidySum != '' and subsidySum != null">来说应该是为true才对,那么执行完整的SQL应该为:

select long_subsidy_his_id, subsidy_name, subsidy_sum
from long_term_subsidy_his
where 1 = 1and subsidy_name like CONCAT("%", ?, "%")
  1. 执行结果

在这里插入图片描述

我们发现动态SQL并没有如期为true把条件拼上,那么是为什么呢

<if test="subsidySum != '' and subsidySum != null">AND subsidy_sum like CONCAT("%",#{subsidySum},"%")
</if>

二、原因分析

  现在问题很明显就是表达式if test="subsidySum != '' and subsidySum != null"为false了,那么是为什么呢?
  首先我先将subsidySum != ''这个条件去掉,结果意外发现表达式竟然成立为true了,那么很明显问题就是出现在这个空串比较了,接着我们去看源码。

1. 源码分析

前面找源码过程省略,直接跳到关键地方

MyBatis 会将if标签的test属性使用ExpressionEvaluator测试一下是否为true或者为false:

public class ExpressionEvaluator {public boolean evaluateBoolean(String expression, Object parameterObject) {Object value = OgnlCache.getValue(expression, parameterObject);if (value instanceof Boolean) {return (Boolean) value;}if (value instanceof Number) {return new BigDecimal(String.valueOf(value)).compareTo(BigDecimal.ZERO) != 0;}return value != null;}/*** @deprecated Since 3.5.9, use the {@link #evaluateIterable(String, Object, boolean)}.*/@Deprecatedpublic Iterable<?> evaluateIterable(String expression, Object parameterObject) {return evaluateIterable(expression, parameterObject, false);}/*** @since 3.5.9*/public Iterable<?> evaluateIterable(String expression, Object parameterObject, boolean nullable) {Object value = OgnlCache.getValue(expression, parameterObject);if (value == null) {if (nullable) {return null;} else {throw new BuilderException("The expression '" + expression + "' evaluated to a null value.");}}if (value instanceof Iterable) {return (Iterable<?>) value;}if (value.getClass().isArray()) {// the array may be primitive, so Arrays.asList() may throw// a ClassCastException (issue 209).  Do the work manually// Curse primitives! :) (JGB)int size = Array.getLength(value);List<Object> answer = new ArrayList<>();for (int i = 0; i < size; i++) {Object o = Array.get(value, i);answer.add(o);}return answer;}if (value instanceof Map) {return ((Map) value).entrySet();}throw new BuilderException("Error evaluating expression '" + expression + "'.  Return value (" + value + ") was not iterable.");}}

从源码看出,MyBatis使用的Ognl表达式来获取test属性的值

2. 写代码验证

在这里插入图片描述
结果发现真的为false
所以原因就是Ognl表达式会把0和空字符串比较为相等


三、解决办法

将空串比较条件去掉,也就是将subsidySum != ''这个条件去掉

代码及执行结果如下

在这里插入图片描述
在这里插入图片描述


总结

  • 本文简单讲述了MyBatis动态SQL的if条件不生效的情况,以及为什么MyBatis动态SQL会把0和空串比较为相等true的原因,这算是MyBatis的一个坑了。
  • 欢迎大家提出建议以及批评,有任何问题可以私信。
http://www.mmbaike.com/news/42065.html

相关文章:

  • 网页模板下载了以后如何进行修改seo黑帽培训骗局
  • 重庆网站建设流程5月疫情最新消息
  • 响应设网站多少钱可以做学习软件的网站
  • 营口旅游网站开发互联网营销师培训大纲
  • 做mod游戏下载网站哈尔滨百度推广公司
  • 网站建设怎么搞seo数据是什么意思
  • 深圳很多90后做虚假彩票网站诈骗百度推广非企代理
  • 企业网站免费推广的方法.百度竞价排名平台
  • 福州网站建设服务公司指数分布的期望和方差
  • 网站 模板 html谷歌浏览器 安卓下载2023版
  • html个人网站制作网站优化推广
  • 汤姆叔叔官方网站建设seo 网站排名
  • 深圳 网站开发公司电话2023上海又出现疫情了
  • 网站开发的评论界面模板百度一下百度百科
  • 积分商城平台seo权威入门教程
  • 网站办公室文化建设郑州seo代理外包公司
  • 鄞州区优秀营销型网站建设首选360安全网址
  • 商城小程序公司怎么去优化关键词
  • 区域工业互联网平台宁波seo推荐优化
  • 吕梁seo网站建设宁波网络推广优化公司
  • 徐州网站建设推广百度知道一下
  • 网站建设公司山而seo搜索引擎优化工资多少钱
  • 网页美工设计的四大原则seo关键词优化推广哪家好
  • 简述dw网站开发流程石家庄seo全网营销
  • 宝鸡做网站市场怎么样2024近期新闻
  • 做关于网站的开题报告免费域名注册平台有哪些
  • 深圳网站公司制作关键词汇总
  • 江阴建设局网站怎么在百度做网站推广
  • 威海做网站www.whbjg做网络推广工作怎么样
  • 厦门谁需要网站建设成都网络推广中联无限