Mybatis的if从句中的赋值乌龙

 更新时间:2025年05月28日 09:27:17   作者:shenzhou_yh  
本文主要介绍了Mybatis的if从句中的赋值乌龙,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

最近遇到一个有点意思的bug,特此记录一下。

问题背景

前台参数:前端请求后台接口,上送参数进行查询,上传参数如下:

接口上送参数

可知上送为两个参数:activityType: “3”,merchantId: “3a9d21a0d18a4e1c819dac57b1730992”

  • 后台逻辑
String activityType = vo.getActivityType();
		String merchantId = vo.getMerchantId();
		List<TbMarketActivity> activity = activityMapper.getActivityByMerchantId(activityType, merchantId);
  • SQL语句
<select id="getActivityByMerchantId"
            resultType="cn.buyforyou.aipc.small.api.entity.marketActivity.TbMarketActivity">
        SELECT
        <include refid="tbMarketActivityColumns"/>,
        b.product_discount as "productDiscount"
        FROM
        tb_market_activity a
        left join tb_market_activity_product b on a.activity_id = b.activity_id
        <where>
            a.status = '2'
            and a.activity_type = #{activityType}
            and a.merchant_id = #{merchantId}
        </where>
        <if test="activityType != null and activityType = '2'.toString()">
			order by product_discount
		</if>
		limit 1
    </select>

后台直接使用前台参数进行数据库查询,sql日志如下:

 ==> Preparing: SELECT a.activity_id AS "activityId", b.product_discount as "productDiscount" FROM tb_market_activity a left join tb_market_activity_product b on a.activity_id = b.activity_id WHERE a.status = '2' and a.activity_type = ? and a.merchant_id = ? order by product_discount limit 1 
 ==> Parameters: 2(String), 3a9d21a0d18a4e1c819dac57b1730992(String)
 <==      Total: 0

那么问题就来了,中间并没有进行任何的上传参数处理,但是到了SQL语句中,activity_type的值是2,而不是上传的3

问题分析

排查一:确认上送参数

在这里插入图片描述

如图,上传参数确实为3,但是到了sql中还是2,很纳闷,确定不是上送参数的问题

  • 排查二:SQL语句
    本次sql并不复杂,就是一个简单的条件过滤查询,而且根据SQL日志来看,也已经成功绑定了

  • 排查三:特么没有可排查的啦,简直就没找到错误,暂定为悬案

反思:为啥上传和代码处理都正确,但是SQL赋值出现错误,明明上传的activityType为3,可最后的条件是2;但又为啥不是其他偏偏是2呢。。。。。。

问题解决

问题的关键点就在于为啥偏偏是2身上,仔细看一下sql语句,这个activityType还是和2产生过联系的。如下:

在这里插入图片描述

这是一个简单的条件判断,并决定排序字段的语句,但是中间却使用了等号作为判断条件,显然这儿是不成立的,大抵已经找到原因了。
activityType就是在这个if判断语句中,被赋值为2的,即使在Mybatis的初始绑定值为3,那这么说的话,activityType不为null时,它的值会一直为2。
继续往下面想,这个if语句的执行顺序,应该是在执行SQL查询之前,那可以推断的是,Mybatis在执行SQL时,首先是先将所有的标签转化组装为SQL,然后在执行SQL语句。所以这里就已经被赋错了值。

解决办法也特别简单,就是再加一个=就可以了,标准的判断语句而已。

补充 :mybatis的映射文件中,使用的是ognl表达式,所以在字符串进行判等的时候,可使用以下两种方法

<if test="sex=='Y'.toString()">
或者
<if test = 'sex== "Y"'>

唯独不能使用

<if test="sex=='Y'">

因为mybatis会把’Y’解析为字符,java是强类型语言,所以不能这样写。

总结

确实觉得很有意思,一个很小的错误,发生的那么不经意,SQL不报错,页面也没有错误,排查起来确实费了点心,以后写代码还是得多加注意呀!!!

到此这篇关于Mybatis的if从句中的赋值乌龙的文章就介绍到这了,更多相关Mybatis if从句赋值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单谈一谈Java中的Unsafe类

    简单谈一谈Java中的Unsafe类

    其实Java官方不推荐使用Unsafe类,因为官方认为,这个类别人很难正确使用,非正确使用会给JVM带来致命错误。但还是要会使用,下面这篇文章就来给大家简单的谈一谈关于Java中Unsafe类的相关资料,需要的朋友可以参考下
    2018-05-05
  • SpringBoot整合Shiro框架,实现用户权限管理

    SpringBoot整合Shiro框架,实现用户权限管理

    Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。作为一款安全框架Shiro的设计相当巧妙。Shiro的应用不依赖任何容器,它不仅可以在JavaEE下使用,还可以应用在JavaSE环境中。
    2021-06-06
  • 最大子数组和Java实现代码示例

    最大子数组和Java实现代码示例

    这篇文章主要介绍了最大子数组和Java实现的相关资料,文中介绍了两种方法来解决寻找具有最大和的连续子数组的问题,第一种方法是动态规划,第二种方法是分治法,需要的朋友可以参考下
    2024-11-11
  • java开发flyway的方法

    java开发flyway的方法

    这篇文章主要介绍了java开发flyway的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • java 数据结构之删除链表中的元素实例代码

    java 数据结构之删除链表中的元素实例代码

    这篇文章主要介绍了java 数据结构之删除链表中的元素实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • spring boot application properties配置实例代码详解

    spring boot application properties配置实例代码详解

    本文通过代码给大家介绍了spring boot application properties配置方法,需要的的朋友参考下吧
    2017-07-07
  • Java中@DS+@Transactional注解切换数据源失效解决方案

    Java中@DS+@Transactional注解切换数据源失效解决方案

    本文主要介绍了@DS+@Transactional注解切换数据源失效解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java运行windows的cmd命令简单代码

    java运行windows的cmd命令简单代码

    这篇文章主要介绍了java运行windows的cmd命令简单代码,有需要的朋友可以参考一下
    2013-12-12
  • java  异常详解及应用实例

    java 异常详解及应用实例

    这篇文章主要介绍了java 异常详解及应用实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • 一步步教你把SpringBoot项目打包成Docker镜像

    一步步教你把SpringBoot项目打包成Docker镜像

    Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化,下面这篇文章主要给大家介绍了关于SpringBoot项目打包成Docker镜像的相关资料,需要的朋友可以参考下
    2023-02-02

最新评论