Mybatis踩坑记录——if从句中的赋值乌龙

2023-12-02 10:38

本文主要是介绍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"FROMtb_market_activity aleft 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从句中的赋值乌龙的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445004

相关文章

Python中4大日志记录库比较的终极PK

《Python中4大日志记录库比较的终极PK》日志记录框架是一种工具,可帮助您标准化应用程序中的日志记录过程,:本文主要介绍Python中4大日志记录库比较的相关资料,文中通过代码介绍的非常详细,... 目录一、logging库1、优点2、缺点二、LogAid库三、Loguru库四、Structlogphp

MyBatis配置文件中最常用的设置

《MyBatis配置文件中最常用的设置》文章主要介绍了MyBatis配置的优化方法,包括引用外部的properties配置文件、配置外置以实现环境解耦、配置文件中最常用的6个核心设置以及三种常用的Ma... 目录MyBATis配置优化mybatis的配置中引用外部的propertis配置文件⚠️ 注意事项X

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

MyBatis-Plus使用动态表名分表查询的实现

《MyBatis-Plus使用动态表名分表查询的实现》本文主要介绍了MyBatis-Plus使用动态表名分表查询,主要是动态修改表名的几种常见场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录1. 引入依赖2. myBATis-plus配置3. TenantContext 类:租户上下文

Spring Boot 集成 mybatis核心机制

《SpringBoot集成mybatis核心机制》这篇文章给大家介绍SpringBoot集成mybatis核心机制,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值... 目录Spring Boot浅析1.依赖管理(Starter POMs)2.自动配置(AutoConfigu

在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南

《在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南》在SpringBoot和MyBatis项目中实现MySQL读写分离,主要有两种思路:一种是在应用层通过代码和配置手动控制... 目录如何选择实现方案核心实现:应用层手动分离实施中的关键问题与解决方案总结在Spring Boot和

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E

MyBatis中的大于等于、小于等于写法

《MyBatis中的大于等于、小于等于写法》MyBatisXML映射文件中处理大于等于和小于等于符号的两种方法:使用转义字符和CDATA块,转义字符更为常见,而CDATA块则提供了一种更易读的解决方案... 目录1. 使用转义字符(推荐)2. 使用 CDATA 块注意事项总结在 MyBATis 的 XML

springboot+mybatis一对多查询+懒加载实例

《springboot+mybatis一对多查询+懒加载实例》文章介绍了如何在SpringBoot和MyBatis中实现一对多查询的懒加载,通过配置MyBatis的`fetchType`属性,可以全局... 目录springboot+myBATis一对多查询+懒加载parent相关代码child 相关代码懒

MyBatis Plus中执行原生SQL语句方法常见方案

《MyBatisPlus中执行原生SQL语句方法常见方案》MyBatisPlus提供了多种执行原生SQL语句的方法,包括使用SqlRunner工具类、@Select注解和XML映射文件,每种方法都有... 目录 如何使用这些方法1. 使用 SqlRunner 工具类2. 使用 @Select 注解3. 使用