内容源于
https://blog.csdn.net/weixin_34452850/article/details/88991943 和
https://blog.csdn.net/LoveInWar/article/details/89646085 总结
简单来说 #{} 在预编译时将参数 使用占位符 ? 代替,然后再实际执行时,会在value左右加入引号,以字符串的方式处理。这样 就可以防止恶意的sql注入
select * from user where username = "10000 or 1 = 1";
而 ${} 只是简单的字符串替换,这样sql会变成
select * from user where username = 10000 or 1 = 1;
因为 1 = 1恒成立,那么不管username是否等于10000 ,都可以查询到所有的数据。这样sql就被恶意注入了。
Mybatis的预编译会将编译后的SQL缓存起来,再次遇到相同的SQL会直接使用不会再次编译
预编译阶段可以对sql语句进行优化;
预编译可以将多个操作步骤合并成一个步骤,一般而言,越复杂的sql,编译程度也会复杂,难度大,耗时,费性
能,而预编译可以合并这些操作,预编译之后DBMS可以省去编译直接运行sql。
