当前位置: 首页 > 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.jsqmd.com/news/102644/

相关文章:

  • 为什么你的healthcheck没生效?:深入剖析Docker Compose Agent检测逻辑
  • 开源MoneyNote:打造你的个人财务管家
  • Kafka-UI内网部署实战指南:从零搭建企业级管理平台
  • d2s-editor终极指南:暗黑破坏神2存档修改完全教程
  • 如何快速批量下载抖音视频:终极自动化工具使用指南
  • DeepSeek-Math实战指南:从入门到精通的深度解析
  • 10分钟快速搭建个人专属气象数据平台:Open-Meteo实战指南
  • 摔倒检测和识别3:基于深度学习YOLOv12神经网络实现摔倒检测和识别(含训练代码、数据集和GUI交互界面)
  • LobeChat能否接入API密钥计费系统?用于Token售卖的可行性探讨
  • 客服管理软件选型决策法:从需求梳理到技术验证的全流程指南
  • 筑牢招聘防线:员工诚信背调的核心价值与实践要点
  • Mem Reduct终极指南:免费内存优化工具完整教程
  • 如何在普通GPU上运行70亿参数Llama-2对话模型:完整实践指南
  • Kafka-UI内网部署实战:三步搞定隔离环境集群管理
  • Obsidian样式设置插件完全指南:从零开始打造个性化笔记界面
  • Windows远程桌面增强终极指南:简易实现多用户并发与家庭版解锁
  • MySQL主从数据同步实战
  • 鸿蒙MindSpore Lite 离线模型转换指南
  • 神经网络(1)基本原理 正向传播 - MKT
  • UniExtract2深度评测:万能文件提取工具的技术解析与实战应用
  • 5分钟掌握微信QQ消息完整保存:全平台防撤回实用指南
  • Shell脚本入门:让重复工作一键完成
  • 5分钟搞定GitHub同款文档样式:github-markdown-css实战指南
  • 3分钟掌握Windows系统日志监控的完整解决方案
  • 终极免费Windows内存清理工具:快速优化系统性能
  • VNote终极安装配置指南:快速上手跨平台Markdown笔记工具
  • Java程序员狂喜!飞算JavaAI一键修Bug,从此告别通宵,准时下班不是梦
  • Java程序员封神!飞算JavaAI一键终结头秃改Bug,效率直接拉满
  • 18、Yocto项目应用开发中的SDK使用指南
  • 深度解析:如何高效提取Android固件镜像的进阶指南