单引号 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>
相关推荐
ZSYP-S4 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos11 分钟前
C++----------函数的调用机制
java·c++·算法
是小崔啊29 分钟前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全38 分钟前
Java的基础概念(一)
java·开发语言·python
liwulin050639 分钟前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc44 分钟前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
Yuan_o_44 分钟前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Oneforlove_twoforjob1 小时前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言
程序员一诺1 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python
数据小小爬虫1 小时前
利用Java爬虫获取苏宁易购商品详情
java·开发语言·爬虫