放弃where 1 = 1,使用更优雅的SQL条件拼接

列表接口,通常会有多个条件组合查询的业务场景。
映射至mapper.xml中就需要写where 1 = 1来拼接否则就会发生 select * from table where and column = 'value'的语法错误
如今的IDEA中,如果你设置了SQL方言,就会警告你where 1 = 1 始终为true


建议使用<where></where>标签来处理这种情况,此标签会只会在它包含的标签中有返回值的情况下才插入 where子句。并且第一个子句的开头为 and orwhere标签也会将它们去除


以上为实测截图,从右侧控制台执行的SQL语句中,可以发现子句中的首个and已被自动去除,是不是比1 = 1略显优雅呢?

下图为具有代表性的反对观点


反对者认为,去除了数据库层SQL语句中的1=1,但是在应用层多了一次判断————第一个子句需要去除and,这样的优化是无任何意义的。
Mysql在处理指令时,会对1=1这类无效的条件进行优化处理,查询过程中并不影响索引和性能。


笔者认为,两种处理方式在效率上的差异可以忽略不计(where标签去除第一个子句的and与MYSQL的优化处理1=1的速度对比),应用层是开发者的领域,应追求优雅,将1=1这样无逻辑意义的符号放在代码中,是略微不妥的。

posted @ 2023-04-15 10:56  Ashe|||^_^  阅读(153)  评论(0编辑  收藏  举报