单引号 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>
相关推荐
0xDevNull17 小时前
Tomcat 运行原理与架构深度解析
java·架构·tomcat
ch.ju17 小时前
Java程序设计(第3版)第三章——数组
java·开发语言
_waylau17 小时前
“Java+AI全栈工程师”问答01:Spring MVC登录页面错误提示
java·开发语言·vue.js·后端·spring·mvc·springcloud
Giggle121817 小时前
上门家政服务平台 | 多端协同,源码交付,用户端小程序+H5、服务端APP、管理后台
java·小程序·架构·产品运营·个人开发
李斯维17 小时前
工厂设计模式(Factory Pattern):工厂方法与抽象工厂的实例演示
java·设计模式
myloveasuka17 小时前
通配符 “?“
java
AI人工智能+电脑小能手17 小时前
【大白话说Java面试题 第41题】【JVM篇】第1题:JVM由哪些部分组成?
java·开发语言·jvm·后端·面试
Lee川17 小时前
登录注册模块的 JWT 认证机制详解
前端·后端·react.js
0xDevNull17 小时前
ConcurrentHashMap 与 Hashtable 深度对比
java·开发语言
happymaker062617 小时前
Spring学习日记——Day01(简单配置使用Spring,手写Spring的简单工厂模式)
java·学习·spring