1、介绍
当我们开启日志之后,我们再运行单元测试。可以看到在控制台中,输出了执行的SQL语句。
但是我们发现,输出的SQL语句为:delete from emp where id = ?,我们输入的参数 16 并没有在后面拼接,id的值是使用?进行占位。那这种SQL语句我们称为 预编译SQL。
预编译的SQL,有两个优势:
1、性能更高
2、防止SQL注入
1.1、性能提升
1. 性能更高: 预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条insert语句时,SQL语句一样,不会再次编译。 只是输入的参数不同。
性能提升原因见下图:
1.2、注入
防止SQL注入:将敏感字进行转义,并变得安全。
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
如果不防止SQL注入,那么不管你是什么账号密码,只要登录者输入如下代码都可以登陆成功:
所以这是很不安全的!
2、参数占位符
在Mybatis中提供的参数占位符有两种:${...}, #{...}。
他们俩的区别(超高几率面试会问,要记好):
2.1、#{...}
执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值。
使用时机:参数传递,都使用#{…}
安全!
2.2、${...}
拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。
使用时机:如果对表名、列表进行动态设置时使用。
不安全!,但是合适的时候也有用