1=1

  

  
  文章转载自“开发者圆桌”一个关于开发者入门,进阶,踩坑的微信公众号
   1=1”> <br/>
  1=1有什么用?在SQL语言中,写这么一句话就跟没写一样,干嘛要出力不讨好呢。
  </p>
  <p>
  <br/>
  </p>
  <p>
  选择从表1 * 1=1与select * from table1完全没有区别,甚至还有其他许多变种的写法如1 & lt;在2,' '=' a ', ' ' & lt;在“b”等,其目的就只有一个,在那里的条件为永真,得到的结果就是未加约束条件的。
  </p>
  <p>
  <br/>
  </p>
  <p>
  在SQL注入时会用到这个,例如select *从table1 name='测试'给强行加上select *从table1 name='测试' or 1=1这就又变成了无约束的查询了。
  </p>
  <p>
  <br/>
  </p>
  <p>
  然而,1=1的妙处不仅如此,这些使用方法在书本中可能看不到,它们多数来自实际项目。
  </p>
  <p>
  <br/>
  </p>
  <p>
  <>强多条件查询</强>
  </p>
  <p>
  <强> <br/>
  </强>
  </p>
  <p>
  在不定数量查询条件情况下,1=1可以很方便的规范语句。例如一个查询可能有姓名、年龄、电话查询条件,也可能没有,那该如何处理呢?
  </p>
  <p>
  <br/>
  </p>
  <p>
  
  </p>
  <p>
  字符串sql=   

  StringBuffer缓冲=new StringBuffer ();   

  

  buffer.append (sql);   

  

  如果(null !=名字,,!”“.equals(名字)){   

  

  缓冲区。追加(“和名称=" +名字);   

  

  }   

  

  如果(零!=年龄,,!”“.equals(年龄)){   

  

  缓冲区。追加(“和年龄=" +年龄);   

  

  }   

  

  如果(零!=电话,,!”“.equals(手机)){   

  

  缓冲区。追加(“和电话像% +电话+“%”);   

  

  }   

  

  如果不写1=1呢,那么在每一个不为空的查询条件面前,都必须判断有没有在子句,然后在第一个出现的地方加上。   

  

  
  

  

  当然,一般情况下是多表关联查询,如果SQL中已经出现过,子句,那么就没必要添加1=1了,例如:   

  

  
  

  

  如果你正在使用Hibernate, Mybatis等ORM框架的话,这样的问题不需要担心,这些ORM框架都进行了良好的处理。下面是Mybatis的一个配置样例:   

  

  & lt;选择id=" findContact " parameterType=暗赝肌眗esultMap=癈ontactResult”比;   

  

  从表1选择*   

  

  & lt; where>   

  

  & lt;如果测试=" cusId !=null和cusId !='”比;   

  

  和cusId=# {cusId}   

  

  & lt;/if>   

  

  & lt;/where>   

  

  & lt;/select>   

  

  
  

  

  <强>表拷贝   

  

  <强>
     

  

  所谓表的拷贝就是以一个表为源表,拷贝出一个数据和结构都一样的表,以甲骨文为例,其他数据库语法自行参考,基本上大同小异。   

  

  
  

  

  拷贝表(1=1永为真的,拷贝表结构和数据)   

  

  创建,table_name,为,选择,*,从,source_table,在那里,1=1;   

  

  
  

  

  复制表结构(1 & lt;在1永为假,不拷贝数据,仅复制表结构)   

  

  创建,table_name,为,选择,*,从,source_table,在1 & lt;在1;   

  

  
  

  

  有很多技术书籍,并没有使用,1=1而是采用比较复杂的判断逻辑,从这一点也可以看出书本知识与实践的不同,在实践中,开发者会不断使用省事省力的方法,而不是拘泥于书本。   

  

  
  

  

  1=1可能还有其他方面的应用案例,大家不妨留言告知,精选出来,让更多人学会使用1=1这个小的技巧。   

1=1