目录
一、Update语句中使用 where 1 = 1
相信很多程序员在Mybatis的SQL XML中写代码时经常会用到where 1 = 1 这块代码其实是一颗定时炸弹,如果它后面的条件判断语句正常执行不出错,通常是不会有什么影响的。
<if test="orderCodes != null and orderCodes.size() > 0">
如果在某些情况下,上面的订单编号列表传过来是空的话,那么这块SQL最终的执行语句如下:
update 'order' set status = 2 where 1 = 1
这将会把所有的订单状态都改为失效/作废,对于一个大型电商系统而言,这是致命的。因此在我们日常开发中,千万不要在SQL中添加where 1 = 1 虽然没有加where 1 = 1,在某些由于代码的业务校验不完善导致订单号为空,最终的SQL会如下所示,执行的时候会抛出异常,但至少不会影响业务数据的正确性,我们只需要追踪处理异常的逻辑即可。
update 'order' set status = 2 where
二、Select语句中使用 where 1 = 1
同样的,在select查询语句中,我们依然不建议使用where 1 = 1,某些原因导致if条件不生效/未匹配上,对于很多数据表数据量比较大的情况下,SQL语句最终会执行全表查询,这种全量查询会非常耗时占用锁定资源数据,影响其他业务语句。同时,几百万上千万的数据一起被加载到内存JVM中,这会导致JVM频繁GC,最终导致其他业务功能也不可用。
select id, order_no, good_id, user_id, status, create_time from 'order'
where 1 = 1
三、总结
很多人可能对自己的代码很自信,觉得自己的调用代码写的非常严谨,会规避这种错误。但是我们无法保证其他人员在调用的过程中存在的代码编写的风险。 因此,即使我们SQL中报错,也不要加where 1 = 1