news 2026/5/1 6:00:45

【扫盲】sql代码里那个“傻鸟” 1=1 到底是个啥?为什么 MyBatis 不用写?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【扫盲】sql代码里那个“傻鸟” 1=1 到底是个啥?为什么 MyBatis 不用写?

【扫盲】sql代码里那个“傻鸟” 1=1 到底是个啥?为什么 MyBatis 不用写?

很多刚接手旧项目(特别是用 Hibernate/HQL 或 JDBC)的兄弟,第一次看到类似下面的代码时,内心往往是崩溃的:

SELECT * FROM user WHERE 1=1 AND name = '张三'

此时你的脑海里一定会弹幕刷屏:

  • “写这代码的人是不是有病?”
  • “1=1 不是废话吗?还要数据库算一下?”
  • “为什么我写 MyBatis XML 的时候从来不用这招?”

别急,存在即合理。今天咱们就来扒一扒这个“傻鸟”1=1到底是为了解决什么千古难题。


一、 那个“傻鸟” 1=1,其实是“拼”出来的无奈

首先你要明白一个核心区别:

  • 你眼里的 SQL:是写在 XML 里或者 Navicat 里的,是静态的。
  • Java 程序里的 SQL:是根据用户点选的条件,动态拼接出来的字符串。
场景还原

假设你做一个“人员搜索”功能,有三个输入框:姓名年龄电话。用户想填哪个填哪个。

如果不用 1=1,你的 Java 代码得写成这样(地狱模式):

String sql = "SELECT * FROM user"; boolean isFirstCondition = true; // 搞个标记,判断是不是第一个条件 // 1. 处理姓名 if (name != null) { if (isFirstCondition) { sql += " WHERE name = '" + name + "'"; // 第一个不能加 AND isFirstCondition = false; // 标记改为false } else { sql += " AND name = '" + name + "'"; } } // 2. 处理年龄 if (age != null) { if (isFirstCondition) { // 每次都要判断是不是第一个!烦死! sql += " WHERE age = " + age; isFirstCondition = false; } else { sql += " AND age = " + age; } }

看到没有?为了确定**“谁是第一个条件”**(第一个条件前要加WHERE,后面的要加AND),程序员不得不写一堆恶心的if-else判断。

这时候,聪明的程序员想了一招(懒人模式):

既然不知道谁是第一个,那我就先人为造一个永远为真的“假条件”放在第一个

// 先把 WHERE 1=1 扔这占坑 String sql = "SELECT * FROM user WHERE 1=1"; // 后面所有人,统统无脑加 "AND"! if (name != null) { sql += " AND name = '" + name + "'"; } if (age != null) { sql += " AND age = " + age; }

真相大白:

1=1 的作用就是一个**“转接头”**。它占住了 WHERE 后面第一个位置,让后面所有的条件都可以统一用 AND 开头,彻底消灭了繁琐的判断逻辑。


二、 为什么 MyBatis 的 XML 里没有?

你说:“我在 MyBatis 里写动态查询,也是三个框随便填,为啥我不写 1=1?”

那是因为MyBatis 把你当宝宝宠坏了。并不是不需要处理这个问题,而是 MyBatis 默默在后台帮你把这活儿干了。

来看看 MyBatis 的神器 ——<where>标签

MyBatis 的写法:
<select id="findUser"> SELECT * FROM user <where> <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </where> </select>
MyBatis 在后台干的“脏活累活”:

当 MyBatis 解析这个<where>标签时,它运行了一套智能逻辑:

  1. 自动检测内容:如果<where>标签里没有任何条件满足(用户啥都没填),它就不生成 WHERE 关键字
  2. 自动去头:如果标签里有内容,且内容是以ANDOR开头的,它会自动帮你把第一个 AND 删掉

对比一下:

  • HQL/JDBC 拼接字符串:就像手动挡汽车,离合、换挡都要你自己操作(必须写1=1占位)。
  • MyBatis XML:就像自动挡+辅助驾驶,你只管踩油门(写AND),系统自动帮你判断什么时候挂档(处理WHERE和去掉多余的AND)。

三、 灵魂拷问:写 1=1 会影响性能吗?

很多有洁癖的程序员会担心:“数据库执行的时候,还要专门算一下 1 等不等于 1,这不多余吗?”

答案:完全不会。

现在的数据库(MySQL、Oracle)都贼精明。它们的**查询优化器(Optimizer)**在拿到 SQL 的第一瞬间,就会把1=1这种恒为真的废话给优化掉。

在数据库眼里:

SELECT * FROM user WHERE 1=1 AND age=18

↓ 自动优化为 ↓

SELECT * FROM user WHERE age=18

所以,性能损耗为0


四、 总结

  1. HQL / JDBC 里的1=1:不是傻,是智慧的妥协。它是为了在纯字符串拼接时代,简化代码逻辑、避免if-else地狱的必要手段。
  2. MyBatis 里的清爽:不是因为问题消失了,而是框架提供了**<where>标签**,在底层帮你完成了“去多余 AND”的操作。
  3. 以后见到1=1:不要骂它傻鸟,请瑞思拜(Respect)。那是老一代程序员为了偷懒…哦不,为了代码整洁留下的智慧结晶。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 3:06:21

经验总结:AC与AP控制平面异常导致业务不可用

在无线网络中有一种故障极具欺骗性:终端显示Wi-Fi已连接,信号强、速率高、无漫游,但所有业务访问失败,重连、换AP、重启终端都无效。这类问题90%不在射频也不在链路,而是在AC与AP的控制 / 数据平面关系被悄悄切断 一、故障现象:无线看起来一切正常但完全不能用 用户侧反…

作者头像 李华
网站建设 2026/4/29 17:22:58

不止兼容!金仓数据库三重革新,重塑企业级数据底座核心竞争力

兼容 是对企业历史投资的尊重 是确保业务平稳过渡的基石 然而 这仅仅是故事的起点 在数字化转型的深水区&#xff0c;企业对数据库的需求早已超越“语法兼容”的基础诉求。无论是核心业务系统的稳定运行&#xff0c;还是敏感数据的安全防护&#xff0c;亦或是复杂场景下的性能优…

作者头像 李华
网站建设 2026/4/23 1:11:41

进程(4)操作系统进程状态与linux进程状态

本章目标 1.操作系统学科的进程状态 2.Linux具体的进程状态 3.简单讨论前后台进程(在2中穿插介绍) 1.操作系统学科的进程状态 在正常的操作系统学科中进程状态的表示如下图所表示但是这个图放在那一块具体的操作系统来说都是正确的,但是它与当下的所流行的操作系统的进程状态所…

作者头像 李华
网站建设 2026/5/1 5:43:13

零基础小白网络安全入门指南:2025年保姆级攻略

一、为什么选择网络安全&#xff1f;网络安全行业正处于黄金发展期&#xff0c;2025年人才缺口达200万&#xff0c;平均薪资区间6k-15k&#xff0c;工作2年后可达8k&#xff0c;5年经验突破12k。无论是想转行还是提升技能&#xff0c;网络安全都是值得投入的优质赛道。二、新手…

作者头像 李华
网站建设 2026/5/1 5:43:48

精品数据分享 | 锂电池数据集(八)CALCE电池数据集-圆柱形电池

继前分享的锂电池数据 精品数据分享 | 锂电池数据集&#xff08;一&#xff09;新能源汽车大规模锂离子电池数据集 精品数据分享 | 锂电池数据集&#xff08;二&#xff09;Nature子刊论文公开锂离子电池数据 精品数据分享 | 锂电池数据集&#xff08;三&#xff09;西安交通…

作者头像 李华
网站建设 2026/4/29 16:46:09

资深黑客都在删除的Linux日志,记录了哪些致命信息?黑客技术零基础入门必看教程!

日志文件对于任何 Linux 用户而言都是至关重要的工具。它们记录了操作系统和应用程序运行时发生的事件信息&#xff0c;包括错误、警告和安全警报等。系统会根据一系列规则自动记录这些信息&#xff0c;帮助管理员监控系统状况并排查问题。在本文中&#xff0c;我们将深入探讨日…

作者头像 李华