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

客观看待mybatis 中使用 where 1=1

随便一翻,可以看到使用where 1=1 的人很多, 可能这已经是一个编码习惯了。

那么使用where 1=1 ,会怎么样么 。


首先,先辟谣。  

 

 


where 1=1 不会导致索引失效 !
where 1=1 不会导致索引失效 !
where 1=1 不会导致索引失效 !

客观看待 :

为什么会去写这个where 1=1 ? 

WHERE 1=1 

示例:

<select id="queryList" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from user_info
    where 1=1

    <if test="type !=null">
        and TYPE = #{type}
    </if>
</select>

可能很多人看到这,已经知道,其实mybatis有where 标签是专门用于这种场景的。

而且绝大多数人都知道where标签,只是还是习惯使用 where 1=1 .

其实就是两个点 :

1. 复制粘贴,随便哪个查询都是if 标签, 复制改一改, 为了不报错,加上 where 1=1 ,完事。
2. 知道mysql 会将接收到的sql 指令做优化,这种where 1=1 是会被优化掉的,所以不影响。

不影响索引命中:

 不使用 where 1=1 ,能够命中索引:


 使用 where 1=1 ,一样命中索引:

所以再说一次 :  where 1=1 不会导致索引失效 !

Mybatis where标签

示例:

<select id="queryList" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from user_info
    <where>
        <if test="type !=null">
            and TYPE = #{type}
        </if>
    </where>
</select>

 可以看到使用where标签的话,第一个感觉就是,代码顺畅一点,但是多了一个where标签的使用知识需要知道。

可以看到,我的示例,上面 where标签  里面 的第一个if标签里面 有写 and 。

这个是没影响的,mybatis也会帮我们做优化,第一个 and这种东西没关系的。

因为多个if标签同时存在的时候,只要保证触发了的标签  两两之间是用 and 或者 or这些连接起来就行, 第一个会自动优化掉。当然这是mybatis帮我们做的事情。

我怎么知道?看源码看的 :
mybatis where标签的源码:

可以看到代码里面 where标签 只是定义了一下 所谓的前缀list,实际上还是用的super。

继承的父类,其实就是 trim 标签。
所以我们使用where标签写的示例,也可以改成使用trim标签 :
 

<select id="queryList" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from user_info
    <trim prefix="WHERE" prefixOverrides="AND | OR" >
        <if test="type !=null">
            and TYPE = #{type}
        </if>
    </trim>
    
</select>

trim标签 ,也可以瞄一眼源码:

prefix:给trim标签内sql语句加上前缀
suffix:给trim标签内sql语句加上后缀
prefixOverrides:去除多余的前缀内容,如:prefixOverrides=“AND”,去除trim标签内sql语句多余的前缀"AND"
suffixOverrides:去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","

那么mybatis怎么去处理这个where标签(包括任何其他标签)的呢? 其实mybatis源码上有相关的测试函数,也可以看的是怎么给我们如何解析where标签,最后拼接成sql的。

感兴趣的可以自己看看(如果你自己有想法,其实可以自己定义自己的一套规则,反正最终是解析拼接出sql语句。):

 值得思考的问题

扯远了,那么回到正题, 客观看待使用 where 1=1 .

上面列了一些where标签的源码,为什么我要列这些。

其实就是为了引出一个值得思考斟酌的问题?

使用 where 1=1 ,mysql底层会帮我们优化, 不影响索引。

使用where标签, 则需要 代码层面 帮我们解析。


那么这样来说,是不是使用where标签,其实也会存在性能问题,毕竟要走代码解析? 

那么是选择在java代码应用层的解析还是选择 mysql底层的优化呢?


这个问题留给大家思考。

相关文章:

  • MySql 怎么查出符合条件的最新的数据行?
  • Springboot 手动分页查询,分批批量插入数据
  • SpringBoot (走读源码)静态方法中调用spring注入的对象,注入对象为null?
  • HashMap 使用的时候指定容量?你真的用明白了吗?(值得一阅)
  • 用这个免费CDN,治愈WordPress网站加载缓慢的大难题
  • 搞什么啊? URI 和 URL 到现在还不清楚?
  • Springboot 根据数据库表自动生成实体类和Mapper,只需三步
  • SpringBoot 导出多个Excel文件,压缩成.zip格式下载
  • Springboot 指定自定义模板导出Excel文件
  • Mysql 我随手造200W条数据,给你们讲讲分页优化。
  • 【云原生】风云暗涌的时代,DBA们的利刃出鞘了
  • 以后面试官问你 为啥不建议使用Select *,请你大声回答他!
  • Springboot 导入导出Excel ,一对多关系,复合表格、合并单元格数据
  • 怎么清晰地理解、表达 IaaS 、 PaaS 、 SaaS ?
  • UML类图的六大关系,最佳学习理解方式
  • [译]CSS 居中(Center)方法大合集
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 77. Combinations
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • STAR法则
  • sublime配置文件
  • webpack4 一点通
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 目录与文件属性:编写ls
  • 少走弯路,给Java 1~5 年程序员的建议
  • 详解移动APP与web APP的区别
  • 移动端解决方案学习记录
  • 从如何停掉 Promise 链说起
  • 大数据全解:定义、价值及挑战
  • 正则表达式-基础知识Review
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 飞书APP集成平台-数字化落地
  • # 数论-逆元
  • #每日一题合集#牛客JZ23-JZ33
  • (第61天)多租户架构(CDB/PDB)
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)ORM
  • .apk文件,IIS不支持下载解决
  • .NET 读取 JSON格式的数据
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • 。Net下Windows服务程序开发疑惑
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [2]十道算法题【Java实现】
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [ARM]ldr 和 adr 伪指令的区别
  • [BZOJ] 3262: 陌上花开
  • [CISCN2019 华东南赛区]Web4
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [HDOJ4911]Inversion