当前位置: 首页 > news >正文

面试tips--MyBatis--<where> where 1=1 的区别

1. 两种写法的背景

在动态 SQL 中,经常需要根据条件拼接 WHERE 子句:

  • 如果直接拼接,容易出现 多余的 AND / OR 或者 空 WHERE 的情况。

  • 为了解决这个问题,有两种常见做法:

    • 方式一:写 WHERE 1=1,后续条件都用 AND 拼接。

    • 方式二:使用 MyBatis 的 <where> 标签,它会自动处理 WHERE 和 AND。


2. <where> 的特点

  • <where> 会自动在拼接的第一个条件前加上 WHERE

  • 如果条件前面有多余的 ANDOR,会自动去掉。

  • 如果没有条件,则不会生成 WHERE

✅ 示例:

<select id="queryUser" resultType="User">SELECT * FROM user<where><if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>

如果 name = 'Tom'age = null,生成 SQL 为:

SELECT * FROM user WHERE name = 'Tom';

如果两个条件都为空:

SELECT * FROM user;

3. where 1=1 的特点

  • WHERE 1=1 永远成立,相当于一个 假条件占位符

  • 后续条件就可以直接拼接 AND,避免多余的逻辑判断。

✅ 示例:

<select id="queryUser" resultType="User">SELECT * FROM userWHERE 1=1<if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if>
</select>

如果 name = 'Tom'age = null,生成 SQL 为:

SELECT * FROM user WHERE 1=1 AND name = 'Tom';

如果条件都为空:

SELECT * FROM user WHERE 1=1;

4. 为什么不推荐 where 1=1

  • 语义不清晰:多了一个永远为真的条件,看上去比较“脏”。

  • 可能影响优化器(MySQL 5.7 以前)

    • MySQL 在 5.7 以前的优化器,对 WHERE 1=1 可能无法完全优化掉,会导致 执行计划不够简洁

    • 例如 EXPLAIN 时,可能仍会保留 1=1,对复杂 SQL 可能造成 额外开销

  • 可维护性差:别人看 SQL 时会疑惑为什么写一个无意义的条件。


5. MySQL 版本差异

  • MySQL 5.6 及以前

    • WHERE 1=1 有可能被保留在执行计划中(虽然性能影响一般不大,但在高并发复杂查询下可能有影响)。

    • 因此很多人建议避免这种写法,改用 <where>

  • MySQL 5.7 及以后

    • 优化器对 WHERE 1=1完全优化掉,执行计划不会受影响。

    • 性能几乎等同于 <where>,所以从性能角度讲已经没问题。


6. 总结

  • 推荐写法:使用 MyBatis 的 <where>,因为:

    • 自动处理条件拼接,避免 SQL 脏乱。

    • 不需要担心 MySQL 版本的差异。

  • WHERE 1=1 的问题

    • 在 MySQL 5.6 及以前,优化器可能无法完全消除,导致执行计划里有多余条件。

    • 在 MySQL 5.7+ 已经优化掉了,性能没问题,但语义和可维护性仍不如 <where>

👉 结论:从语义和维护角度出发,优先用 <where>,即使在 5.7+ 版本中。

http://www.dtcms.com/a/359132.html

相关文章:

  • 如何查看Linux系统中文件夹或文件的大小
  • 【LeetCode - 每日1题】有效的数独
  • SQLSugar 快速入门:从基础到实战查询与使用指南
  • MySQL 在 CentOS 上的安装与配置文件路径详解
  • 【系列06】端侧AI:构建与部署高效的本地化AI模型 第5章:模型剪枝(Pruning)
  • 【LeetCode - 每日1题】鲜花游戏
  • 深度学习:洞察发展趋势,展望未来蓝图
  • Verilog 硬件描述语言自学——重温数电之典型组合逻辑电路
  • 深度学习通用流程
  • 用更少的数据识别更多情绪:低资源语言中的语音情绪识别新方法
  • nestjs连接oracle
  • 大模型备案、算法备案补贴政策汇总【广东地区】
  • SNMPv3开发--snmptrapd
  • CNB远程部署和EdgeOne Pages
  • More Effective C++ 条款18:分期摊还预期的计算成本(Amortize the Cost of Expected Computations)
  • 数据库的CURD
  • Shell 秘典(卷三)——循环运转玄章 与 case 分脉断诀精要
  • C语言类型转换踩坑解决过程
  • Java高并发架构核心技术有哪些?
  • 安装Redis
  • compute:古老的计算之道
  • 【ROS2】ROS2 基础学习教程 、movelt学习
  • Docker实战避坑指南:从入门到精通
  • plantsimulation知识点 多条RGV驮一台工件图标显示顺序问题
  • lumerical_FDTD_光源_TFSF
  • 【AI】【强化学习】强化学习算法总结、资料汇总、个人理解
  • php连接rabbitmq例子
  • SpringCloud学习笔记
  • 大模型应用开发面试全流程实录:RAG、上下文工程与多Agent协作技术深度解析
  • ABAP 刷新屏幕