先说一下:看完如果恍然大悟了,值得一赞 值得一赞 值得一赞
先给两个经不起推敲的常见答案:
#{}
底层采用的是PreparedStatement,会预编译,因此不会产生SQL注入问题;
#{}
不会产生字符串拼接,${}
会产生字符串拼接,因此${}
会出现SQL注入问题;
最后给出一个正确的答案:
MyBatis的#{}之所以能够预防SQL注入是因为底层使用了PreparedStatement类的setString()方法来设置参数,此方法会获取传递进来的参数的每个字符,然后进行循环对比,如果发现有敏感字符(如:单引号、双引号等),则会在前面加上一个'/'代表转义此符号,让其变为一个普通的字符串,不参与SQL语句的生成,达到防止SQL注入的效果。