单引号 vs 双引号:在MyBatis条件判断中的选择困境

哈喽,大家好呀,好久不见!今天是一篇浅记。MyBatis的条件判断中,使用单引号或双引号来判定字符串类型数值的坑...

一、单引号与双引号的区别

在MyBatis的条件判断中,使用单引号或双引号来括起字符串值都是可以的。但是在比较字符串类型的数字时,它们会产生不同的效果。

  • 单引号:使用单引号括起字符串值,比较的是字符的字典顺序,而不是数值的大小。
  • 双引号:使用双引号括起字符串值,会将字符串尝试转换为数值类型进行比较。

这就引发了一个问题:字符串类型数值形式数据如何处理判定呢?单引号就一定不能用吗?

让我们以一个字段 bpmStatus的条件判断为例,它存储了流程状态的值,以字符串类型的数字表示。需要根据不同的状态值生成不同的 SQL 条件。

java 复制代码
<if test="dto.bpmStatus != null and dto.bpmStatus != ''">
 <choose>
  <when test="dto.bpmStatus == '3'">
    AND (a.bpm_status = '4' OR a.bpm_status = '5')
  </when>
  <when test="dto.bpmStatus == '1'">
    AND a.bpm_status = '2'
  </when>
  <when test="dto.bpmStatus == '2'">
    AND a.bpm_status = '3'
  </when>
 </choose>
</if>

乍一看,可能认为这样的写法 "没有问题",好像觉得 "使用了单引号括起数值字符,它们就是字符串了" 。但是你运行代码后,你会发现条件判断并没有生效,SQL 条件没有被正确拼接!

楼主甚至还傻傻的检查了一下参数定义,主打就是一个纯情:怀疑过代码都没有怀疑过自己......

没毛病,问题的根源确实在于字符串类型的数字不能这么处理

二、解决方案

为了解决这个问题,我们有两种方案:

方案一:转换数字类型

为了确保条件判断的准确性,建议在比较字符串类型的数字时使用双引号括起字符串值。这样会将字符串尝试转换为数值类型进行比较,得到正确的结果。

java 复制代码
<if test="dto.bpmStatus != null and dto.bpmStatus != ''">
 <choose>
  <when test='dto.bpmStatus == "3"'>
    AND (a.bpm_status = '4' OR a.bpm_status = '5')
  </when>
  <when test='dto.bpmStatus == "1"'>
    AND a.bpm_status = '2'
  </when>
  <when test='dto.bpmStatus == "2"'>
    AND a.bpm_status = '3'
  </when>
 </choose>
</if>

方案二:转换字符串类型

如果你希望继续使用单引号括起字符串值,但又需要进行数值比较,可以考虑进行数据类型转换为字符串,也可以实现。

java 复制代码
 <if test="dto.bpmStatus != null and dto.bpmStatus != ''">
    <choose>
        <when test="dto.bpmStatus == '3'.toString()">
            AND (a.bpm_status = '4' OR a.bpm_status = '5')
        </when>
        <when test="dto.bpmStatus == '1'.toString()">
            AND a.bpm_status = '2'
        </when>
        <when test="dto.bpmStatus == '2'.toString()">
            AND a.bpm_status = '3'
        </when>
    </choose>
 </if>
相关推荐
SelectDB8 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
SelectDB8 小时前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
程序猿大帅8 小时前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java
PinkSun8 小时前
Spring AI ChatMemory踩坑实录:重启丢数据、Agent丢记忆、对话溢出
后端·ai编程
壹方秘境8 小时前
我用Go语言开发了一个跨平台的HTTPS抓包和调试工具
前端·后端·ios
神秘面具男8 小时前
HarmonyOS 6.0跨端远程控制
前端·后端
苏三说技术9 小时前
全网爆火的Loop到底是什么?
后端
神奇小汤圆9 小时前
Loop Runtime 架构拆解:别再手动催 Agent,先把工程闭环跑起来
后端
程序员cxuan9 小时前
幽默,一个 Github 名字叫“马尾辫”,但是他给你省了 80% 的 token
人工智能·后端·程序员