Mybatis的预编译是借助PreparedStatement
{}这种会自动处理成字段值(加双引号进行转义)
${}这种则不会预编译,直接当成字符串拼成SQL,会被注入
预编译功能依赖具体DB实现,有些没有实现这个功能
预编译的目的:
1. 提高性能
2. 避免注入
如何提高性能?
在使用PreparedStatement执行SQL命令时,命令会带着占位符被数据库进行编译和解析,并放到命令缓冲区
每当执行同一个PreparedStatement语句的时候,由于在缓冲区中可以发现预编译的命令,虽然会被再解析一次,但不会被再次编译
如何避免注入?
通俗来讲它把传入的参数当成SQL来拼接,它仅仅当做某个字段的一个属性值.也就是说当你注入一段乱七八糟的SQL时,它会糅合成一个属性值,而不是形成新的SQL.
而SQL注入只对编译过程有破坏作用,执行阶段只是把输入串作为数据处理,不需要再对SQL语句进行解析,因此解决了注入问题.
这样即使你传入一长串SQL,它也不会被编译, 会尝试将字面量按照字符串进行转义处理.