注意了!mybatis中<if>条件判断,遇到带数字单字符有坑!

SpringBoot+Vue图书商城管理系统:前后端分离架构与实战部署详解 前后端分离架构已成为现代Web开发的主流范式,它将后端接口服务与前端交互界面解耦,显著提升了系统的可维护性与扩展性。在Java技术体系中,SpringBoot凭借约定优于配置的特性,快速构建RESTful服务;Vue则通过组件化与双向绑定,高效实现动态页面。接合MyBatis动态SQL,可灵活应对多条件筛选、关联查询等复杂业务场景,MySQL提供稳定可靠的数据存储。这一技术组合被广泛应用于电商、企业管理系统等中小型项目。从用户浏览、购物车、订单流转到后台维护,完整的业务闭环是检验工程能力的试金石。本文基于一 阅读详情

当mybatis判断条件<if>与单字符数字比较,会判断错误。大家是否踩过这个坑?

1.代码复现

先看这个例子:

//UserInfoTab 对象
@Data
public class UserInfoTab {
    private Integer id;

    private String userName;

    private String userId;
    ...
}

mybatis 查询

 <select id="selectByUserInfo" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from user_info_tab a
    <where>
      <if test="userId == '1' ">
        and a.user_name = 'tianluoboy'
      </if>
      <if test="userId != '1' ">
        and a.user_name != 'tianluoboy'
      </if>
    </where>
  </select>

目前用户表的数据:

图片

现在我的单元测试查询是这样的:

    @Test
    void testQueryUserInfo(){
        List<UserInfoTab> userInfoTabList = userInfoTabDao.selectByUserInfo("1");
        if (CollectionUtils.isEmpty(userInfoTabList)) {
            userInfoTabList.forEach(System.out::println);
        }
    }

如果这个条件生效:

<if test="userId == '1' ">
        and a.user_name = 'tianluoboy'
</if>

我应该查到tianluoboy这条记录,但是事实查到的结果,却是:

图片

也就是说<if test="userId == '1' ">这个条件不生效。

2. 正确的使用方法

如果改成用双引号包着"1",或者用toString()转换一下,则是可以正确查出来的:

 <if test='userId == "1"'>
        and a.user_name = 'tianluoboy'
</if>

<if test="userId == '1'.toString()">
   and a.user_name = 'tianluoboy'
</if>

3. 原因解析

Mybatis 是使用OGNL表达式来解析的,'1'会解析为字符Character,一个字符Character和一个String 当然不相等,这就是为什么<if test="userId == '1' ">不生效。

图片

大家有兴趣可以去debug看看源码哈,这个类:

org.apache.ibatis.ognl.OgnlOps

关键方法是这个:

public static int compareWithConversion(Object v1, Object v2) {
        label75: {
            int result;
            if (v1 == v2) {
                result = 0;
            } else {
                int t1 = getNumericType(v1);
                int t2 = getNumericType(v2);
                int type = getNumericType(t1, t2, true);
                switch (type) {
                    case 6:
                        result = bigIntValue(v1).compareTo(bigIntValue(v2));
                        break;
                    case 7:
                    case 8:
                        break label75;
                    case 9:
                        result = bigDecValue(v1).compareTo(bigDecValue(v2));
                        break;
                    case 10:
                        if (t1 != 10 || t2 != 10) {
                            break label75;
                        }

                        if (v1 instanceof Comparable && v1.getClass().isAssignableFrom(v2.getClass())) {
                            result = ((Comparable)v1).compareTo(v2);
                            break;
                        }

                        if (!(v1 instanceof Enum) || !(v2 instanceof Enum) || v1.getClass() != v2.getClass() && ((Enum)v1).getDeclaringClass() != ((Enum)v2).getDeclaringClass()) {
                            throw new IllegalArgumentException("invalid comparison: " + v1.getClass().getName() + " and " + v2.getClass().getName());
                        }

                        result = ((Enum)v1).compareTo(v2);
                        break;
                    default:
                        long lv1 = longValue(v1);
                        long lv2 = longValue(v2);
                        return lv1 == lv2 ? 0 : (lv1 < lv2 ? -1 : 1);
                }
            }

            return result;
        }

        double dv1 = doubleValue(v1);
        double dv2 = doubleValue(v2);
        return dv1 == dv2 ? 0 : (dv1 < dv2 ? -1 : 1);
    }
基于SpringBoot+Vue3+MyBatis的宠物领养系统前后端分离实战 在Java全栈开发中,前后端分离架构是主流形态。SpringBoot凭借自动装配与内嵌容器大幅降低搭建成本,Vue3的组合式API让前端逻辑聚合更清晰,MyBatis以动态SQL支撑灵活的条件查询,配合MySQL完成数据落地——这套技术组合广泛适用于信息管理类项目。以宠物领养系统为实践载体,涵盖了用户权限、宠物管理、领养申请流转、公告发布等模块,贯通数据库设计、JWT认证、动态SQL、跨域联调等关键环节,并对MyBatis单字符比较陷阱、SpringBoot版本兼容、事务自调用失效等工程问题给出排查思路,为 阅读详情

相关推荐

SpringBoot+Vue+MyBatis+MySQL图书电商系统实战:从数据库设计到部署

前后端分离架构是现代Web开发的基石,SpringBoot与Vue的组合凭借高效开发体验成为主流选择。数据库设计决定了系统稳定性,合理的索引优化与事务控制能保障电商场景下的数据一致性。本文基于图书商城项目,深入讲解MyBatis动态SQL、MySQL索引实践、Vue路由与状态管理,并覆盖Nginx部署与常见问题排查。适合Java学习者及全栈开发者,帮助串联完整业务链路,提升实战能力。

weixin_34184561的博客 377

mybatis 中if关于数字的判断

mybatise中使用if 判断 数字

GuiBing_haonan的博客 5802

SSM架构物联网数据采集后台实战:SpringMVC与MyBatis核心解析

在Java后端开发中,SSM(Spring MVC + Spring + MyBatis)是一套经典的企业级开发组合,尤其适合物联网设备数据采集场景。它通过清晰的分层设计,让Spring容器统一管理对象与事务,SpringMVC负责HTTP请求的接收与转发,MyBatis则专注于SQL持久化操作。面对物联网场景中设备高并发上报、时序数据存储、接口幂等和批量写入等实际需求,Controller-Service-Mapper三层架构能有效实现设备鉴权、数据解析、批量入库与阈值告警。文章基于真实项目源码,重点剖析

weixin_33462167的博客 257

mybatis 使用if 判断数值型

mybatis 中 动态if 使用ognl表达式判断。当对象是Number类型,当传值为0时会被解析成false,否则为true

曾令胜的博客 2372

W5500 MACRAW模式实战:在ESP32上抓取并解析原始以太网数据包

本文详细介绍了如何在ESP32开发板上使用W5500芯片的MACRAW模式捕获和解析原始以太网数据包。通过硬件连接指南、代码实现示例和协议解析技巧,帮助开发者深入理解网络通信底层机制,实现网络嗅探和自定义协议开发等高级应用。

weixin_42520573的博客 418

Qt·DBus快速入门

DBus快速入门

m0_64560763的博客 2273

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

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

刘大猫 2322

基于RYU+Mininet的SDN校园网络实战:从零搭建虚拟化实验环境

本文详细介绍了如何利用RYU控制器和Mininet搭建SDN校园网络实验环境,从Ubuntu虚拟机准备到网络拓扑设计,再到关键网络功能实现。通过实战案例展示SDN在校园网络中的应用优势,包括简化配置、提升效率等,为网络工程师和学生提供了一套完整的虚拟化实验方案。

weixin_30872499的博客 455

MyBatis中动态sql的if条件判断的各种使用方式

mybatis的动态sql拼接让很多复杂业务的处理变得简单化,开发人员只需要在xml文件中直接编写sql语句即可。

Katharsis_2021的博客 2万+

中职网络安全2021年国赛Wireshark流量分析题目解析

中职网络安全Wireshark流量分析题目解析

FRANXX_02的博客 6442

RT-DETR-R18 的轻量化 Trick:剪枝与量化在模型中的应用

RT-DETR-R18轻量化技术通过结构化剪枝、混合精度量化和知识蒸馏的组合优化,实现了显著模型压缩效果。摘要如下: RT-DETR-R18模型通过创新轻量化技术组合,在保持46.2% mAP精度的前提下,将模型大小压缩至2.1MB(压缩率78%),计算量降至3.2 GFLOPs(减少78.2%),实现移动端28ms实时推理(加速37.8%)。核心技术包括:1)渐进式结构化剪枝系统,通过L1范数重要性评估和动态剪枝调度;2)混合精度量化策略,对关键层保留FP16精度;3)教师-学生知识蒸馏框架保持模型表达能

走向CTO的路上... 1190

MyBatis 动态 SQL 之 OGNL 表达式:从入门到避坑指南

MyBatis动态SQL中OGNL表达式使用指南 本文系统总结了MyBatis动态SQL中OGNL表达式的使用方法和常见陷阱。主要内容包括: 字符串处理技巧:详细讲解了null判断、空串处理、单字符类型陷阱等常见问题,特别强调了字符串比较时的类型匹配问题。 数字类型转换:深入解析了OGNL的布尔隐式转换规则,指出数字0值会被解析为false这一特殊机制,并提供了最佳实践建议。 高级用法:介绍了如何调用Java静态方法,包括内置工具类和自定义工具类的使用。 实用技巧:补充了Map类型取值等实用方法。

蒙眼过河 1308

数字孪生教程大全之 我们如何构建数字孪生?数字孪生的五个级别都是什么

文章摘要 什么是数字孪生? 我们如何构建数字孪生? 开发智能数字孪生系统的框架 什么是数字孪生? 数字孪生是一个不言自明的术语,用于识别物理系统的数字化版本。数字孪生的最早参考来自大卫·格伦特(David Gelernter )的小说作品。在他 1995 年的书中,Gelernter 博士为读者提供了未来有趣的可能性——万维网。前网络书籍谈到了计算机系统上的镜像数字世界。有些人可能会争辩说,我们的 Meta-verse 是新的数字世界——现实世界的数字孪生。但是,还有其他可能性,时间可能会讲述一个更好的

iCloudEnd的博客 3630

MyBatis中字符串比较的类型解析问题与解决方案

摘要:MyBatis的Mapper.xml文件中,单字符字符串(如'1')会被OGNL解析为char类型,导致与String类型比较失效。本文提出四种解决方案:1)使用.toString()显式转换;2)改用双引号包裹字符串(推荐);3)调用equals方法(推荐);4)将逻辑移至Service层(最推荐)。对于字符串数字比较,可通过+0实现隐式转换。建议优先通过业务代码处理复杂逻辑,保持SQL简洁性,或利用语法特性确保比较准确性。

麦克马的博客 488

MATLAB 车牌识别系统

车牌识别系统利用计算机视觉和图像处理技术,自动识别车辆牌照上的字符信息。本系统基于 MATLAB 实现车牌识别,包括图像预处理、车牌定位、字符分割、字符识别等模块。车牌识别系统是实现智能交通和公共安全的重要手段,具有广泛的应用前景。MATLAB 提供了丰富的工具和函数,可以方便地进行算法仿真和系统开发。

走向CTO的路上... 720

ABAP 系统里使用 SAP Joule 辅助编程的前提条件

只是说这些大语言模型是针对互联网上能够挖掘到的所有数据进行训练,不像 SAP Joule 那样术业有专攻,仅仅深耕 SAP 技术和业务领域,因此大伙儿对 SAP Joule 的期望值,也远远高于通过大语言模型。SAP Joule 从 ABAP Development Tool 的 Chat 窗口中接收到的对话请求,都会路由到 SAP BTP 上的 AI Foundation.在上述 ABAP 环境中启用 SAP Joule,需要购买额外的 license:8019124.

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 796

mybatis教程

mybatis

global_coding的博客 379

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SpringBoot+Vue3宠物领养系统实战:从数据库设计到部署避坑

在Java全栈开发中,SpringBoot与Vue3的组合已成为构建前后端分离应用的主流方案。SpringBoot通过自动装配简化服务端配置,Vue3组合式API提升前端逻辑组织能力,而MyBatis则在动态SQL与缓存机制上考验着开发者的功底。以宠物领养系统为实战案例,完整覆盖从MySQL表结构设计、后端接口开发、JWT登录鉴权,到前端Vue3页面联调与部署的流程。针对实际开发中常见的springboot版本太高的兼容性风险,以及MyBatis单个数字字符比较的隐蔽报错,提供了可复现的避坑经验;同时梳理了

weixin_33230433的博客 129

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring Boot+Vue+MyBatis+MySQL构建中小型工厂质量管理系统实战

前后端分离架构已成为企业级应用开发的标配,如何选择稳定且易维护的技术栈是中小型制造企业数字化转型的关键。Spring Boot、Vue、MyBatis与MySQL的组合,凭借成熟生态和低成本优势,能够快速构建贴合车间实际的质量管理系统。本文从需求分析出发,梳理中小工厂在来料检验(IQC)、过程巡检(IPQC)、成品检验(FQC/OQC)及不合格品处理中的真实痛点,详解数据库表设计、RBAC权限模型、JWT认证、统计报表SQL等核心实现,并给出从环境准备、后端打包到Nginx部署的完整流程。这套方案兼顾工程实

weixin_34295316的博客 346

基于SpringBoot+Vue的图书个性化推荐系统实战解析

推荐系统是当下互联网产品必备的智能组件,其核心价值在于通过用户行为数据挖掘潜在兴趣,实现“人找信息”到“信息找人”的转变。协同过滤是其中应用最广泛的算法之一,基于用户或物品的相似性计算完成个性化匹配。在工程实践中,推荐系统与主流Java全栈技术天然契合——SpringBoot提供快速构建后端服务的能力,Vue负责交互友好的前端展示,MyBatis与MySQL则高效支撑数据存储与复杂查询。这种组合不仅适用于图书个性化推荐场景,也能迁移到电商、资讯等各类管理系统中。本文基于这一技术栈,完整拆解从数据库建模、相似

weixin_34220179的博客 380

前后端分离民族婚纱预定系统:SpringBoot+Vue+MyBatis实战解析

随着企业信息化深入,前后端分离架构已成为现代Web应用开发的主流范式,其核心价值在于接口解耦、并行开发与独立部署。SpringBoot作为后端微服务快速开发框架,搭配MyBatis灵活的动态SQL和MySQL关系型数据库,能够高效实现复杂业务的数据建模与查询。在资源预约类场景中,如婚纱租赁、会议室预定等,核心难点在于时间窗口的并发冲突控制,需要借助数据库行锁等机制保证数据一致性。从业务建模、数据库设计、后端接口、前端页面到部署上线,完整实现路线与关键踩坑记录详细呈现了基于SpringBoot+Vue+MyB

weixin_29913663的博客 137

SpringBoot+Vue大学生竞赛管理系统设计与实现全解析

前后端分离架构已成为现代Web开发的标配,SpringBoot与Vue的组合凭借简洁高效的特点被广泛采用。从基础概念出发,理解RESTful接口设计、JWT鉴权、MyBatis持久化等原理,是掌握企业级开发的关键。这类技术栈不仅支撑高并发业务场景,也为高校毕业设计、课程设计提供了绝佳的实战平台。本文以大学生竞赛管理系统为例,系统讲解从数据库表结构设计到前后端联调部署的完整流程,覆盖核心业务模块、状态流转、权限控制及高频踩坑记录,为读者提供一套可直接落地的工程化参考。

weixin_33857230的博客 550

SpringBoot+Vue+MyBatis前后端分离房屋租赁系统实战教程

前后端分离架构已成为现代Web开发的标配,它通过将前端展示层与后端服务层解耦,实现了多端复用与独立迭代。SpringBoot作为后端框架,简化了RESTful接口的开发,而Vue则提供了高效的组件化页面构建能力,两者结合MyBatis灵活的SQL控制与MySQL稳定的存储,能够快速构建企业级业务系统。本文以房屋租赁系统为载体,深入解析从业务拆解、数据库设计、动态SQL查询到Vue路由守卫与axios封装,再到Nginx部署的全流程。通过一个完整的实战项目,帮助开发者理解前后端交互原理,掌握多角色权限控制、订

weixin_42556197的博客 222

SpringBoot+Vue+MyBatis民宿管理系统:全栈开发实战解析

全栈开发是当前软件工程领域的高频需求,其本质在于打通前端交互、后端业务逻辑与数据持久化之间的完整链路。以RESTful接口为核心,前后端分离架构已成为主流,而后端通过ORM框架实现对数据库的高效操作,再结合状态机模型管理复杂业务流转,构成了现代管理类系统的技术基石。这类架构在中小型业务场景中价值尤为突出,能够快速构建稳定、可维护的应用,广泛应用于民宿管理、酒店预订、教务管理等行业信息化项目。本文以一个基于SpringBoot与Vue框架、搭配MyBatis和MySQL实现的民宿管理系统为例,从需求分析、数据

weixin_33462927的博客 184
上一篇: 为什么 ““.length !== 3 ?
下一篇: 苹果的AI终于掏出来了,但说实话一点也不炸裂。
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值