在工作中的老项目中经常会看到代码中使用了1=1的情况,想起来之前自己也这个样子写过,感觉也没有啥影响就没有当回事,随着工作年限,工作经验的增加,对着一块有了更深的理解,下面我们就来看一看。代码开发中,编写SQL语句其实就和家常炒菜差不多,每个条件语句就是一个调料,所以每一种调料都会影响菜的味道,对于SQL来说查询条件的增加,影响的就是执行SQL的效率。那么1=1这种为什么又会存在呢,存在即有它的道理,下面我们更深一层次的分析一下。
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这种条件,在SQL语句经过优化器的时候也会被优化掉,但是对于不同的数据库就有了不同的结果。另一个点就是如果都是1=1,没有进行优化,相当于把表中的全部数据都要进行一遍循环,判断一下这个毫无用处的条件是否满足。
查询优化器就相当于是个图书管理员,他知道如何最快的查找到你所需要的书,当你告诉它你所需要的书的特征之后,他会根据这些信息选择一个最快定位到该图书的方式路径。但是如果我们告诉它一些无关紧要的信息,这不就相当于废话了吗,加密??哈哈哈哈哈想起来废话文学了,听君一席话,胜听一席话啊。所以说的多不一定有用,只需要把关键信息提供出来就可以。一个带有“1=1”的查询可能就相当与让图书管理员一本书一本书的去比较来检查是不是你所需要的,显然这是不合理的。
编写尽可能高效、清晰和准确的SQL语句,不仅有助于保持代码的质量,也让代码具有更好的可维护性和可扩展性。
<!-- 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 中,避免使用 1=1 的典型方法是利用动态SQL标签(如 <if>)来构建条件查询。<where> 标签会自动处理首条条件前的 AND 或 OR。当没有满足条件的 <if> 或其他条件标签时,<where> 标签内部的所有内容都会被忽略,从而不会生成多余的 AND 或 WHERE 子句。
var query = context.User.AsQueryable(); if (!string.IsNullOrEmpty(username)) { // 堆代码 duidaima.com 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。