mybatis为啥不建议mapper文件用where 1=1

2022-06-14 16:27:38 浏览数 (1)

技术群里一个小伙伴提了一个问题,说为什么mybatis中不建议mapper文件中不建议用where 1=1,看到这个问题,想到之前我在多条件查询拼接时用到了where 1=1 ,没有出现任何问题,而且where 1=1 仅仅只是为了防止多条件查询时sql错误,一般用也没啥问题,但还是带着这个问题去mybatis官网去翻阅了一遍,发现官网中并没有说明不建议使用。但是其实也是有说明的:以下是原文:

地址:https://mybatis.net.cn/dynamic-sql.html

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

代码语言:javascript复制
<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG
  <where>
    <if test="state != null">
         state = #{state}
    </if>
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

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

如果 where 元素与你期望的不太一样,你也可以通过自定义 trim 元素来定制 where 元素的功能。比如,和 where 元素等价的自定义 trim 元素为:

代码语言:javascript复制
<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>

在 MyBatis 中,建议尽量避免使用无意义的 SQL 拼接 where 1=1,我们可以使用标签来替代, where 1=1用标签完全可以解决问题就不用where 1=1了

where 1=1 可能存在的问题

  • 不建议使用where 1=1这种语句,一是不安全,存在SQL注入的风险;二也不高效,可能会造成查询条件失效,全表扫描;
  • SQL中使用了where 1=1 ,很优美的解决了参数中ageValue为空时SQL语法错误的情况。但是当表中的数据量比较大的时候查询速度会非常慢,很可能会造成非常大的性能损失。
  • 加了"1=1"的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(也就是全表扫描)以比较此行是否满足过滤条件,因此如果数据检索对性能有比较高的要求就不要使用这种"where 1=1"的方式来偷懒

0 人点赞