mybatis中<if>条件判断带数字的字符串失效问题

news2025/1/12 13:41:04

在这里插入图片描述

文章目录

  • 一、项目背景
  • 二、真实错误原因说明
  • 三、解决方案
    • 3.1针对纯数字的字符串值场景
    • 3.2针对单个字符的字符串值场景
  • 四、参考文献

一、项目背景

MySQL数据库使用Mybatis查询拼接select语句中进行<if>条件拼接的时候,发现带数字的或者带单个字母的字符串失效问题。
举例说明:我Log对象有个属性accountId是字符串类型,假设我给它赋值为“1”,按常理sql拼接的应该是and account_name = 'unmadmin' ,然而实际判断拼接的却是and account_name != 'unmadmin',明显感觉问题出在这里and log.accountId == '1' 这里校验失败了,或者说失效了,估计很多人会踩坑,那么为什么呢?不应该啊?所以此刻就是为了定位它原因。

Log 对象

public class Log {
    private String logId;
    private String accountId;
    private String accountName;
}

xml

<select id="queryOperateLog" resultType="Log">
	select * from user 
	<where>
            1 = 1
            <if test="log.accountId != null and log.accountId != '' and log.accountId == '1'">
                and account_name = 'unmadmin'
            </if>
            <if test="log.accountId != null and log.accountId != '' and log.accountId != '1'">
                and account_name != 'unmadmin'
            </if>
   </where>
   order by exectime desc
 </select>         

二、真实错误原因说明

结论:mybatis会把纯数字的字符串进行强制转换,就是大白话讲说碰到log.accountId == ‘1’它会把’1’强制抓换成字符格式,而字符串“1” = = 字符’1’,比较结果为false。
重点:Mybatis是使用的OGNL表达式来进行解析的,在OGNL的表达式中,'1’会被解析成字符,因为java是强类型的,char 和 一个String 会导致不等。所以if标签中的sql不会被解析。

那么这时候网友会问了,单引号''""双引号在mysql中感觉差不多啊,平常使用也没问题啊,其实主要区别在这里,国内chatGPT给出的答案是:

在这里插入图片描述
国外chatGPT给出的答案是:
在这里插入图片描述

那么网友会问了,平常我使用的时候输入字符串使用单引号’'或者双引号""也没碰到过这个问题啊,其实问题出在String accountId值上:

  • 如果accountId值是多个字符串字母或者字符串和数字的组合,单引号双引号完全没问题。
  • 如果accountId值是纯数字,比如’1’ '211’之类的,就会出现问题。

三、解决方案

既然原因已经找到了,那么如何解决它呢,其实有2种方案:

3.1针对纯数字的字符串值场景

方案1:外面使用单引号,里面使用双引号

错误写法:
在这里插入图片描述
正确写法:
在这里插入图片描述

方案2:使用.toString(),这个方案新颖,估计一般人见都没见过,即单引号保留,但是后面多拼接了个.toString()

在这里插入图片描述

3.2针对单个字符的字符串值场景

别以为只有纯数字有问题,实际单个字符也是有问题的,假设我有个String type字段,我给它判断值传字符y,具体如下

错误写法:你这么写判断也失效

<if test="type=='y'">
	and status = 0
</if>

正确写法:

<if test='type=="y"'>
	and status = 0
</if>

四、参考文献

备注说明:这东西不是我研究出来的,是恰巧搜到了两位道友的博客才有所了解的:↓
道友1博客:mybatis中条件判断带数字的字符串
道友2博客:Mybatis if 判断等于一个字符串

另外我实际追踪过源码,因为我猜测是获取对象值进行类型转换拼接sql的时候出现了判断问题,但是追着追着就跟踪丢了,所以源码究竟哪里进行转换的我也没找到,如果有道友找到了也可以分享出来一起学习下;

另外我甚至翻阅了Mybatis的OGNL表达式,但是也没找出个所以然来,我只知道accountId == '1'确实进行了类型转换,但是究竟是往字符转还是往数字类型转我也不知道,因为找不到官网做论证,所以这块如果有道友真正找到了也可以分享出来一起学习下。

完结、撒花!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1623792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Coursera: An Introduction to American Law 学习笔记 Week 03: Property Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 03: Property LawKey Property Law TermsSupplemental Re…

LM324的输出VOL与IOL你注意过吗?

电路图 途中LMC6084 更改为LM324 故障现象 这个电路的输入输出表达式为 R30 两端电压等于0V 当J16 的4脚与2脚相等&#xff0c;等于5V&#xff08;或者4脚略大于2脚时&#xff09;7脚输出 约 500mV&#xff1b; 实际应该为0V左右才对.见下图 故障原因 上图运放输出低电平…

AI重塑数字安全,安恒信息行胜于言

有人曾言&#xff1a;所有行业都值得基于人工智能技术重做一遍。 深以为然。如今&#xff0c;数字安全产业面临着一次重要的重塑机遇。以大模型为代表的人工智能技术正深刻影响着数字安全市场格局、产品研发、技术方案以及运营服务。产业界已形成共识&#xff0c;即谁能抓住人…

Nginx+Lua+OpenResty(详解及使用)

一、 Nginx简介 Nginx是一个高性能的Web服务器和反向代理的软件。 Web服务器&#xff1a;就是运行我们web服务的容器&#xff0c;提供web功能&#xff0c;还有tomcat也提供类似的功能。 代理是软件架构和网络设计中&#xff0c;非常重要的一个概念。 二、Nginx的反向代理&…

WEB服务的配置与使用 Apache HTTPD

服务端&#xff1a;服务器将发送由状态代码和可选的响应正文组成的 响应 。状态代码指示请求是否成功&#xff0c;如果不成功&#xff0c;则指示存在哪种错误情况。这告诉客户端应该如何处理响应。较为流星的web服务器程序有&#xff1a; Apache HTTP Server 、 Nginx 客户端&a…

百度网盘svip白嫖永久手机2024最新教程

百度网盘&#xff08;原名百度云&#xff09;是百度推出的一项云存储服务&#xff0c;已覆盖主流PC和手机操作系统&#xff0c;包含Web版、Windows版、Mac版、Android版、iPhone版和Windows Phone版。用户将可以轻松将自己的文件上传到网盘上&#xff0c;并可跨终端随时随地查看…

爬虫抓取网站数据

Fiddler 配置fiddler工具结合浏览器插件 配置fiddler Tools--Options 抓包技巧 谷歌浏览器开启无痕浏览,使用SwitchyOmega配置好代理端口 Ctrl x 清理所有请求记录,可以删除指定不需要日志方便观察 设置按请求顺序 观察cookie,观察请求hesder cookie和row返回结果 Swit…

《QT实用小工具·四十二》圆形发光图像

1、概述 源码放在文章末尾 该项目实现了图像的发光效果&#xff0c;特别适合做头像&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; import QtQuick 2.7 import QtGraphicalEffects 1.12Item {id: rootwidth: 80height: 80property int ra…

写Python需要养成的9个编程好习惯

以写Python代码为例&#xff0c;有以下9个编程好习惯。 1. 提前设计 写代码和写作文一样&#xff0c;需要有大纲&#xff0c;不然很容易变成"屎山"。 思考业务逻辑和代码流程&#xff0c;是动手前的准备工作&#xff0c;这上面可以花一半以上时间。 一些程序员洋…

【考研数学】全程跟张宇,《1000题》应该怎么搭配《660》《880》?

数一125学长来了&#xff0c;选题集和选老师经验满满&#xff0c;手把手教你避雷&#xff0c;直接不废话&#xff0c;三本题集很重要&#xff0c;筛选找重点事半功倍。 就老师而言&#xff0c;如果已经决定全程跟张宇老师了&#xff0c;那么就不要中途换老师&#xff01; 就题…

按照模板导出复杂样式的excel

导出excel通常使用的是apache poi,但是poi的api相当复杂&#xff0c;所以当导出的excel样式比较复杂时&#xff0c;写起来就比较头疼了&#xff0c;这里推荐使用easypoi, 可以很方便的根据模板来导出复杂excel 文档地址: 1.1 介绍 - Powered by MinDoc 我们要实现如图所示效果…

C++的二叉搜索树

目录 基本概念 二叉搜索树的实现 插入结点 查找结点 删除结点 删除结点左为空 删除结点右为空 基于特殊情况的优化 删除结点左右不为空 基于特殊情况的优化 完整代码 二叉搜索树的实际应用 K和KV模型 改造二叉搜索树为为KV模型 基本概念 1、二叉搜索树又称二叉…

数据结构之二叉搜索树底层实现洞若观火!

目录 题外话 正题 二叉搜索树 底层实现 二叉搜索树查找操作 查找操作思路 查找代码实现详解 二叉搜索树插入操作 插入操作思路 插入代码详解 二叉搜索树删除操作 删除操作思路 删除代码详解 小结 题外话 我的一切都是党给的,都是人民给的,都是家人们给的!! 十分感…

LeetCode:51. N 皇后

leetCode51.N皇后 题解分析 代码 class Solution { public:int n;vector<vector<string>> ans;vector<string> path;vector<bool> col, dg,udg;vector<vector<string>> solveNQueens(int _n) {n _n;col vector<bool> (n);dg …

通过matlab对比遗传算法优化前后染色体的变化情况

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 通过matlab对比遗传算法优化前后染色体的变化情况. 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ....................................…

AI视频教程下载:用ChatGPT和 MERN 堆栈构建 SAAS 项目

这是一个关于 掌握ChatGPT 开发应用的全面课程&#xff0c;它将带领你进入 AI 驱动的 SAAS 项目的沉浸式世界。该课程旨在使你具备使用动态的 MERN 堆栈和无缝的 Stripe 集成来构建强大的 SAAS 平台所需的技能。 你将探索打造智能解决方案的艺术&#xff0c;深入研究 ChatGPT 的…

第十五章数据管理成熟度评估6分

15.1 引言 能力成熟度评估&#xff08;Capability Maturity Assessment&#xff0c;CMA&#xff09; 是一种基于能力成熟度模型&#xff08;Capability MaturityModel&#xff0c;CMM&#xff09;框架的能力提升方案&#xff0c;描述了数据管理能力初始状态发展到最优化的过程…

一键部署,隐私无忧!有道QAnything,本地AI问答系统开源了,你下载了吗?

作者&#xff1a;Aitrainee | 公众号&#xff1a;AI进修生 排版太难了&#xff0c;请点击这里查看原文&#xff1a;一键部署&#xff0c;隐私无忧&#xff01;有道QAnything&#xff0c;本地AI问答系统开源了&#xff0c;你下载了吗&#xff1f; 一键部署&#xff0c;隐私无忧…

AWVS的使用

AWVS的使用 1、使用docker拉取AWVS的镜像 docker pull secfa/docker-awvs 2.使用AWVS docker run -it -d -p 13443:3443 --cap-add LINUX_IMMUTABLE secfa/docker-awvs 3.访问 4.输入账号密码 https://hub.docker.com/r/secfa/docker-awvs 找到账号密码 username:adminadmin.…

azure云服务器学生认证优惠100刀续订永久必过方法记录

前面的话 前几天在隔壁网站搞了个美国edu邮箱&#xff0c;可以自定义用户名。今天就直接认证Azure&#xff0c;本来打算等GitHub学生包过期后用这个edu邮箱重新认证白嫖Azure的。在昨天无意中看到续期&#xff0c;就把原本那个Azure账号续了一年&#xff0c;所以这个美国edu邮…