当前位置: 首页 > 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.cnnetsun.cn/news/97977.html

相关文章:

  • 洛谷 P1551 亲戚
  • d2s-editor终极指南:暗黑破坏神2存档修改完全教程
  • UniExtract2深度评测:万能文件提取工具的技术解析与实战应用
  • MySQL主从数据同步实战
  • 破局Java开发困境!飞算科技JavaAI引领智能化开发新革命
  • 21、Yocto项目应用开发全解析
  • HS2-HF_Patch:解锁HoneySelect2完整游戏体验的智能解决方案
  • Obsidian Style Settings 插件终极使用指南:快速掌握个性化定制技巧
  • Jellyfin插件MetaShark中TMDB刮削缓慢问题的深度排查与优化方案
  • 移动端AI绘图新突破:用TensorFlow Lite搞定denoising-diffusion实战指南
  • 抖音下载神器:揭秘批量保存直播回放的技术工具
  • 抖音直播下载终极指南:一键保存精彩回放
  • Motrix扩展:3步实现浏览器下载效率300%提升
  • Motrix浏览器扩展终极指南:解锁专业下载管理新境界
  • 解锁B站缓存新姿势:m4s-converter视频转换完全指南
  • LobeChat自动伸缩策略:根据GPU负载动态调整实例数量
  • 团队成长阶段的管理重点
  • 贪心算法:像“贪吃蛇”一样,永远只吃眼前的苹果?
  • java计算机毕业设计文华社区医生预约管理系统的设计与实现 社区医疗在线挂号与诊疗排班平台的设计与实现 居民健康服务预约系统开发
  • Swagger2Word终极指南:3分钟快速将API文档转为专业Word格式
  • LobeChat用户行为追踪:借助GA4收集使用数据
  • Llama-2-7B聊天模型完整部署实战指南:从零到企业级应用
  • 从零到上线:5分钟快速部署LobeChat镜像并接入Token服务
  • 21、分布式监控与Web界面使用指南
  • EmotiVoice语音合成在博物馆导览系统中的落地实践
  • 31、Nagios CGI 配置详解
  • LobeChatCTA按钮文案优化建议
  • 零基础学网安创新?8 大方向 + 学习路径(超详细),入门到精通看这篇
  • 挖到宝了!2025 网安 200 万缺口,零基础→年薪 50W 路径全公开
  • 19、量子计算:理论与实践探索