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获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Spring Boot结成MyBatis-Plus最全配置指南

《SpringBoot结成MyBatis-Plus最全配置指南》本文主要介绍了SpringBoot结成MyBatis-Plus最全配置指南,包括依赖引入、配置数据源、Mapper扫描、基本CRUD操... 目录前言详细操作一.创建项目并引入相关依赖二.配置数据源信息三.编写相关代码查zsRArly询数据库数

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma