2026/1/19 2:00:37
网站建设
项目流程
做外贸必备网站,北京网站开发要多少钱,石家庄万达网站制作,多少钱能运营一个网站【扫盲】sql代码里那个“傻鸟” 11 到底是个啥#xff1f;为什么 MyBatis 不用写#xff1f;
很多刚接手旧项目#xff08;特别是用 Hibernate/HQL 或 JDBC#xff09;的兄弟#xff0c;第一次看到类似下面的代码时#xff0c;内心往往是崩溃的#xff1a;
SELECT * FRO…【扫盲】sql代码里那个“傻鸟” 11 到底是个啥为什么 MyBatis 不用写很多刚接手旧项目特别是用 Hibernate/HQL 或 JDBC的兄弟第一次看到类似下面的代码时内心往往是崩溃的SELECT * FROM user WHERE 11 AND name 张三此时你的脑海里一定会弹幕刷屏“写这代码的人是不是有病”“11 不是废话吗还要数据库算一下”“为什么我写 MyBatis XML 的时候从来不用这招”别急存在即合理。今天咱们就来扒一扒这个“傻鸟”11到底是为了解决什么千古难题。一、 那个“傻鸟” 11其实是“拼”出来的无奈首先你要明白一个核心区别你眼里的 SQL是写在 XML 里或者 Navicat 里的是静态的。Java 程序里的 SQL是根据用户点选的条件动态拼接出来的字符串。场景还原假设你做一个“人员搜索”功能有三个输入框姓名、年龄、电话。用户想填哪个填哪个。如果不用 11你的 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 11 扔这占坑 String sql SELECT * FROM user WHERE 11; // 后面所有人统统无脑加 AND if (name ! null) { sql AND name name ; } if (age ! null) { sql AND age age; }真相大白11 的作用就是一个**“转接头”**。它占住了 WHERE 后面第一个位置让后面所有的条件都可以统一用 AND 开头彻底消灭了繁琐的判断逻辑。二、 为什么 MyBatis 的 XML 里没有你说“我在 MyBatis 里写动态查询也是三个框随便填为啥我不写 11”那是因为MyBatis 把你当宝宝宠坏了。并不是不需要处理这个问题而是 MyBatis 默默在后台帮你把这活儿干了。来看看 MyBatis 的神器 ——where标签。MyBatis 的写法select idfindUser SELECT * FROM user where if testname ! null AND name #{name} /if if testage ! null AND age #{age} /if /where /selectMyBatis 在后台干的“脏活累活”当 MyBatis 解析这个where标签时它运行了一套智能逻辑自动检测内容如果where标签里没有任何条件满足用户啥都没填它就不生成 WHERE 关键字。自动去头如果标签里有内容且内容是以AND或OR开头的它会自动帮你把第一个 AND 删掉对比一下HQL/JDBC 拼接字符串就像手动挡汽车离合、换挡都要你自己操作必须写11占位。MyBatis XML就像自动挡辅助驾驶你只管踩油门写AND系统自动帮你判断什么时候挂档处理WHERE和去掉多余的AND。三、 灵魂拷问写 11 会影响性能吗很多有洁癖的程序员会担心“数据库执行的时候还要专门算一下 1 等不等于 1这不多余吗”答案完全不会。现在的数据库MySQL、Oracle都贼精明。它们的**查询优化器Optimizer**在拿到 SQL 的第一瞬间就会把11这种恒为真的废话给优化掉。在数据库眼里SELECT * FROM user WHERE 11 AND age18↓ 自动优化为 ↓SELECT * FROM user WHERE age18所以性能损耗为0。四、 总结HQL / JDBC 里的11不是傻是智慧的妥协。它是为了在纯字符串拼接时代简化代码逻辑、避免if-else地狱的必要手段。MyBatis 里的清爽不是因为问题消失了而是框架提供了**where标签**在底层帮你完成了“去多余 AND”的操作。以后见到11不要骂它傻鸟请瑞思拜Respect。那是老一代程序员为了偷懒…哦不为了代码整洁留下的智慧结晶。