news 2026/4/16 6:17:37

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开发过程中动态 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导致全表查询(可能性能低);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 9:03:38

Kafka-UI内网部署实战指南:从零搭建企业级管理平台

【免费下载链接】kafka-ui provectus/kafka-ui: Kafka-UI 是一个用于管理和监控Apache Kafka集群的开源Web UI工具&#xff0c;提供诸如主题管理、消费者组查看、生产者测试等功能&#xff0c;便于对Kafka集群进行日常运维工作。 项目地址: https://gitcode.com/GitHub_Trend…

作者头像 李华
网站建设 2026/4/15 21:19:06

开源MoneyNote:打造你的个人财务管家

还在为每月账单发愁吗&#xff1f;开源免费的MoneyNote记账系统正是你需要的财务助手&#xff01;这款专为个人和家庭设计的财务管理工具&#xff0c;能帮你轻松掌握收支状况&#xff0c;实现财富增长目标。 【免费下载链接】moneynote-api 开源免费的个人记账解决方案 项目地…

作者头像 李华
网站建设 2026/4/16 9:04:18

5分钟掌握微信QQ消息完整保存:全平台防撤回实用指南

5分钟掌握微信QQ消息完整保存&#xff1a;全平台防撤回实用指南 【免费下载链接】Anti-recall Android 免root 防撤回神器 ! 项目地址: https://gitcode.com/gh_mirrors/an/Anti-recall 你是否经历过这样的场景&#xff1a;工作群里领导刚刚布置的任务突然消失&#xff…

作者头像 李华
网站建设 2026/4/16 10:17:02

实测封神!Java企业级开发AI代码生成深度测评:效率飙升70%+,安全零漏洞

引言&#xff1a;AI代码生成技术的工业化落地验证在Java企业级开发领域&#xff0c;AI代码生成技术的实用价值始终饱受争议。支持方坚信其能大幅提升开发效率、减少编码失误&#xff1b;反对方则担忧其生成代码存在可读性差、可维护性不足等隐患。为客观评判该技术的实际表现&a…

作者头像 李华
网站建设 2026/4/16 10:23:47

VUE3:深入浅出自定义事件

什么是自定义事件&#xff1f;自定义事件是子组件向父组件"发信号"。比如子组件的按钮被点击了&#xff0c;需要通知父组件执行某些操作。也就是Vue中子组件向父组件通信的机制。子组件通过defineEmits声明事件&#xff08;数组或对象形式&#xff09;&#xff0c;在…

作者头像 李华
网站建设 2026/4/16 10:38:40

23、跨平台系统管理:从SSH到OS X脚本的全面指南

跨平台系统管理:从SSH到OS X脚本的全面指南 在管理多样化的 *nix 机器基础设施时,结合使用 SSH 密钥、NFS 挂载的源目录和跨平台 Python 代码是一种有效的方法。下面将详细介绍具体步骤和相关工具的使用。 管理系统的步骤 步骤 1:创建 SSH 公钥 需要在用于管理机器的系统…

作者头像 李华