mybatis解决动态拼接的where 1=1问题

当遇到多个查询条件,使用where 1=1 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了 “where 1=1 ”的过滤条件之后,数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描) 来比较此行是否满足过滤条件,当表中的数据量较大时查询速度会非常慢;此外,还会存在SQL 注入的风险。

select
    
    from student
    where 1=1
    
      and name like concat('%', #{name}, '%')
    
    
      and sex=#{sex}
    

可以使用where标签

select
    
    from student
 < where>
    
      and name like concat('%', #{name}, '%')
    
    
      and sex=#{sex}
    

where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。

你可能感兴趣的:(后端)