当前位置: 首页 > news >正文

开发过程中动态 SQL 中where 1=1的作用是什么

在这条 MyBatis 动态 SQL 中,where 1=1动态拼接 WHERE 条件的经典技巧,核心作用是:解决 “第一个动态条件前是否需要加 AND” 的问题,让条件拼接逻辑更简洁、无歧义

一、先看核心问题:没有1=1会怎样?

假设去掉where 1=1,SQL 会变成:

where <if test="query.shopIdList != null and query.shopIdList.size()>0"> and a.shopId in (...) </if> <if test="query.shopId != null and query.shopId != ''"> and a.shopId=#{query.shopId} </if> ...

如果第一个动态条件不满足(比如shopIdList为 null),最终拼接的 SQL 会是:

select ... from dws_shop_itemcate_sum a where and a.shopId=xxx

where后直接跟and,触发SQL 语法错误BadSqlGrammarException)。

二、where 1=1的核心作用

1=1是一个恒成立的条件(不会过滤任何数据),但它能:

  1. 占住where后的第一个位置,所有动态条件都可以统一以and开头,无需判断 “是不是第一个条件”;
  2. 不影响查询结果1=1永远为真,不会过滤任何数据,最终的查询结果只由后续的动态条件决定;
  3. 简化逻辑:开发时不用逐个判断 “当前条件是不是第一个”,所有动态条件都按and 条件写即可,降低出错概率。

三、代码执行示例(更直观)

场景 1:仅传shopIdList([9001,9002])

最终拼接的 SQL:

select ... from dws_shop_itemcate_sum a where 1=1 and a.shopId in (9001,9002)
场景 2:仅传shopId(9003)+beginTime(2025-01-01)

最终拼接的 SQL:

select ... from dws_shop_itemcate_sum a where 1=1 and a.shopId=9003 and a.reportDate>='2025-01-01'
场景 3:不传任何动态条件

最终拼接的 SQL:

select ... from dws_shop_itemcate_sum a where 1=1

(等价于select ... from dws_shop_itemcate_sum a,查询全表)

四、替代方案(MyBatis 更优雅的写法)

MyBatis 提供了<where>标签,可以替代1=1,自动处理多余的and/or

<select id="sumNumberCardDataByShop" resultType="StNumberCardDataBO"> select <include refid="numberCard_queryColumn"/> from dws_shop_itemcate_sum a <where> <!-- 替代 where 1=1 --> <if test="query.shopIdList != null and query.shopIdList.size()>0"> a.shopId in <!-- 去掉 and --> <foreach collection="query.shopIdList" item="shopId" index="index" open="(" close=")" separator=","> #{shopId} </foreach> </if> <if test="query.shopId != null and query.shopId != ''"> and a.shopId=#{query.shopId} <!-- 保留 and --> </if> <if test="query.beginTime != null and query.beginTime !=''"> <![CDATA[ and a.reportDate>=#{query.beginTime} ]]> </if> <if test="query.endTime != null and query.endTime !=''"> <![CDATA[ and a.reportDate<=#{query.endTime}]]> </if> </where> </select>
<where>标签的优势:
  • 若有动态条件满足:自动添加where,并去掉第一个条件前的and/or
  • 若没有动态条件满足:不生成where子句(避免where 1=1全表查询);
  • 1=1更优雅,是 MyBatis 推荐的写法。

五、总结

  1. where 1=1的本质:用恒真条件占位,让所有动态条件统一以and开头,避免语法错误
  2. 优缺点:
    • 优点:简单易懂,新手友好;
    • 缺点:若所有动态条件都不满足,会生成where 1=1导致全表查询(可能性能低);
http://www.gsyq.cn/news/113444.html

相关文章:

  • 开源MoneyNote:打造你的个人财务管家
  • 如何快速批量下载抖音视频:终极自动化工具使用指南
  • DeepSeek-Math实战指南:从入门到精通的深度解析
  • 摔倒检测和识别3:基于深度学习YOLOv12神经网络实现摔倒检测和识别(含训练代码、数据集和GUI交互界面)
  • 如何在普通GPU上运行70亿参数Llama-2对话模型:完整实践指南
  • Kafka-UI内网部署实战:三步搞定隔离环境集群管理
  • 5分钟掌握微信QQ消息完整保存:全平台防撤回实用指南
  • 3分钟掌握Windows系统日志监控的完整解决方案
  • Java程序员狂喜!飞算JavaAI一键修Bug,从此告别通宵,准时下班不是梦
  • 深度解析:如何高效提取Android固件镜像的进阶指南
  • 2025坡口激光切管机厂家排名榜单 - 栗子测评
  • 24、嵌入式应用开发指南:Python、Java、Node.js 与 Docker
  • 17、Yocto项目软件层与应用开发指南
  • 38、Python编程实用指南:从基础到高级应用
  • 26、Python 包管理与 Egg 创建全解析
  • 如何快速实现图像压缩:Compressor.js完整使用指南
  • 高效GPU加速下的EmotiVoice语音合成性能优化实践
  • 31、Python GUI 开发指南:从基础到应用
  • 2025衬衫定制厂家综合实力榜单 - 栗子测评
  • 衬衫工厂选哪家好?2025权威排行 - 栗子测评
  • 抖音视频批量下载终极指南:从零基础到高效采集
  • Motrix扩展:3步实现浏览器下载效率300%提升
  • LobeChat灰度放量控制策略
  • 45、实时系统中的线程调度与优先级管理
  • OpenProject版本选择终极指南:从社区版到企业级的完整决策路径
  • LobeChat自动化运维脚本生成
  • Unitree GO2终极指南:21天从零到精通的ROS2 SDK实战手册
  • LobeChat日程管理插件构想:AI帮你安排每日任务
  • LobeChat自动伸缩策略:根据GPU负载动态调整实例数量
  • “为何Java中线程组备受争议?”