单引号 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>
相关推荐
IT_陈寒10 小时前
Vue的响应式让我原地破防,原来问题出在这
前端·人工智能·后端
marvelyu10 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
思考着亮10 小时前
1.RabbitMQ基本使用
后端
XuCoder11 小时前
面试官:Redis 单线程为什么还这么快?这道题答错的人真不少
后端
子兮曰11 小时前
Bun vs Node.js 深度对决:跑分快 4 倍,真实业务只剩 3%,2026 年到底该怎么选?
前端·后端·typescript
码事漫谈11 小时前
把 AI 拆掉,你的系统还能跑吗?
前端·后端
AI人工智能+电脑小能手11 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官11 小时前
Sa-Token和Spring Security对比
java·后端·spring
众人皆醒我独醉11 小时前
Token:AI 世界的基本粒子——不是"字",是统计上最优的"字符组合"
后端·面试·llm
小当家.10512 小时前
深入理解 ReAct Agent:从原理到 Java 实战
java·react.js·agent·react·架构设计·agent设计