第一章 不要在SQL语句里写where 1=1

目录

一、Update语句中使用 where 1 = 1

二、Select语句中使用 where 1 = 1 

三、总结


一、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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值