[点晴永久免费OA]SQL中为什么不要使用1=1?
当前位置:点晴教程→点晴OA办公管理信息系统
→『 经验分享&问题答疑 』
最近看几个老项目的SQL条件中使用了1=1,想想自己也曾经这样写过,略有感触,特别拿出来说道说道。 编写SQL语句就像炒菜,每一种调料的使用都会影响菜品的最终味道,每一个SQL条件的加入也会影响查询的执行效率。那么 1=1 存在什么样的问题呢?为什么又会使用呢? 为什么会使用 1=1?在动态构建SQL查询时,开发者可能会不确定最终需要哪些条件。这时候,他们就会使用“1=1”作为一个始终为真的条件,让接下来的所有条件都可以方便地用“AND”连接起来,就像是搭积木的时候先放一个基座,其他的积木块都可以在这个基座上叠加。 就像下边这样: SELECT * FROM table WHERE 1=1 <if test="username != null"> AND username = #{username} </if> <if test="age > 0"> AND age = #{age} </if> 这样就不用在增加每个条件之前先判断是否需要添加“AND”。 1=1 带来的问题性能问题?有的同学会担心 1=1 给数据库带来额外的负担,产生性能问题。 这实际上可能不会发生,因为现代数据库的查询优化器已经非常智能,它们通常能够识别出像 1=1 这样的恒真条件,并在执行查询计划时优化掉它们。在许多情况下,即使查询中包含了1=1,数据库的性能也不会受到太大影响,优化器会在实际执行查询时将其忽略。 但是现代优化器虽然很强大,但它们并不是万能的。在某些复杂的查询场景中,即使是简单的 1=1 也可能对优化器的决策造成不必要的影响。 代码质量我们仍然需要避免在查询中包含 1=1,因为还有以下几点考虑:
编写尽可能高效、清晰和准确的SQL语句,不仅有助于保持代码的质量,也让代码具有更好的可维护性和可扩展性。 替代 1=1 的更佳做法现在开发者普遍使用ORM框架来操作数据库了,还在完全手写拼SQL的同学可能需要反思下了,这里给两个不同ORM框架下替代1=1的方法。 假设我们有一个用户信息表 user,并希望根据传入的参数动态地过滤用户。 首先是Mybatis: <!-- MyBatis映射文件片段 --> <select id="selectUsersByConditions" parameterType="map" resultType="com.example.User"> SELECT * FROM user <where> <!-- 使用if标签动态添加条件 --> <if test="username != null and username != ''"> AND username = #{username} </if> <if test="age > 0"> AND age = #{age} </if> <!-- 更多条件... --> </where> </select> 在 MyBatis 中,避免使用 WHERE 1=1 的典型方法是利用动态SQL标签(如 <if>)来构建条件查询。<where> 标签会自动处理首条条件前的 AND 或 OR。当没有满足条件的 <if> 或其他条件标签时,<where> 标签内部的所有内容将被忽略,从而不会生成多余的 AND 或 WHERE 子句。 再看看 Entity Framework 的方法: var query = context.User.AsQueryable(); if (!string.IsNullOrEmpty(username)) { query = query.Where(b => b.UserName.Contains(username)); } if (age>0) { query = query.Where(b => b.Age = age); } var users = query.ToList(); 这是一种函数式编程的写法,最终生成SQL时,框架会决定是否在条件前增加AND,而不需要人为的增加 1=1。 总结“1=1”在SQL语句中可能看起来无害,但实际上它是一种不良的编程习惯,可能会导致性能下降。就像在做饭时不会无缘无故地多加调料一样,我们在编写SQL语句时也应该避免添加无意义的条件。 每一行代码都应该有它存在的理由,不要让人和数据库浪费时间在不必要的事情上。 本文作者:萤火架构,转自https://www.cnblogs.com/bossma/p/18024285 ------------ 个人观点:看个乐行了,1=1该用就用无需顾虑那么多。 该文章在 2024/2/24 16:20:49 编辑过 |
关键字查询
相关文章
正在查询... |