经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
给新来的同事讲where?1=1是什么意思
来源:jb51  时间:2021/12/8 10:43:17  对本文有异议

写在前面

新的同事来之后问我where 1=1 是什么有意思,这样没意义啊,我笑了。今天来说明下。

where 1=1

先来看一段代码

  1. <select id="queryBookInfo" parameterType="com.ths.platform.entity.BookInfo" resultType="java.lang.Integer">
  2. select count(id) from t_book t where 1=1
  3. <if test="title !=null and title !='' ">
  4. AND title = #{title}
  5. </if>
  6. <if test="author !=null and author !='' ">
  7. AND author = #{author}
  8. </if>
  9. </select>

上面的代码很熟悉,就是查询符合条件的总条数。在mybatis中常用到if标签判断where子句后的条件,为防止首字段为空导致sql报错。没错 ,当遇到多个查询条件,使用where 1=1 可以很方便的解决我们条件为空的问题,那么这么写 有什么问题吗 ?

网上有很多人说,这样会引发性能问题,可能会让索引失效,那么我们今天来实测一下,会不会不走索引

实测

title字段已经加上索引,我们通过EXPLAIN看下

EXPLAIN SELECT * FROM t_book WHERE title = '且在人间';

image.png

EXPLAIN SELECT * FROM t_book WHERE 1=1 AND title = '且在人间';

image.png

对比上面两种我们会发现 可以看到possible_keys(可能使用的索引) 和 key(实际使用的索引)都使用到了索引进行检索。

结论

where 1=1 也会走索引,不影响查询效率,我们写的sql指令会被mysql 进行解析优化成自己的处理指令,在这个过程中1 = 1这类无意义的条件将会被优化。使用explain EXTENDED sql 进行校对,发现确实where1=1这类条件会被mysql的优化器所优化掉。

那么我们在mybatis当中可以改变一下写法,因为毕竟mysql优化器也是需要时间的,虽然是走了索引,但是当数据量很大时,还是会有影响的,所以我们建议代码这样写:

  1. <select id="queryBookInfo" parameterType="com.ths.platform.entity.BookInfo" resultType="java.lang.Integer">
  2. select count(*) from t_book t
  3. <where>
  4. <if test="title !=null and title !='' ">
  5. title = #{title}
  6. </if>
  7. <if test="author !=null and author !='' ">
  8. AND author = #{author}
  9. </if>
  10. </where>
  11. </select>

我们用where标签代替。

where 标签

MyBatis 有一个简单且适合大多数场景的解决办法。而在其他场景中,可以对其进行自定义以符合需求。而这,只需要一处简单的改动:

  1. <select id="findActiveBlogLike"
  2.  
  3. resultType="Blog">
  4.  
  5. SELECT * FROM BLOG
  6.  
  7. <where>
  8.  
  9. <if test="state != null">
  10.  
  11. state = #{state}
  12.  
  13. </if>
  14.  
  15. <if test="title != null">
  16.  
  17. AND title like #{title}
  18.  
  19. </if>
  20.  
  21. <if test="author != null and author.name != null">
  22.  
  23. AND author_name like #{author.name}
  24.  
  25. </if>
  26.  
  27. </where>
  28.  
  29. </select>

where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

或者使用 where 1=1

总结

到此这篇关于where 1=1是什么意思的文章就介绍到这了,更多相关where 1=1是什么意思内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号