很多时候需要在 Java 代码里动态拼接 sql,于是你会经常看到如下语句:
String sql="select * from testA where 1=1"
buildSQL(sql,params);
buildSQL 就是直接以 and 开头的各种条件了,有的加,有的不加
void buildSQL(sql,params){
StringBuilder buildsql=new StringBuilder(sql);
for(String param:params){
if(param.add()==true){
buildsql.append(param.content());
}
}
return buildsql.toString();
}
以上均为伪代码,正确性不保证。
那么问题来了,1=1 是万无一失的么?
非也,这要取决于你是在拼接 AND 还是 OR
如下面这种情况,or c='1'之类的条件是动态拼接上去的,且无法确定顺序,所以与 and 前面加 1=1 道理一样,需要来个前缀,这时候应该用 1=2,倘若习惯性的写上 1=1,就会因为短路问题,屏蔽掉了 c 这三个条件
select * from testA
where 1=1 and a='1' and b='1' and (1=2 or c='1' or c='2' or c='3')
短路原理说起来很好理解,可是真是防不胜防
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于