#相当于对数据 加上 双引号,$相当于直接显示数据
MyBatis启用了预编译功能,
#{}:在预编译过程中,会把#{}部分用一个占位符?代替,执行时,将入参替换编译好的sql中的占位符“?”,能够很大程度防止sql注入
${}:在预编译过程中,${}会直接参与sql编译,直接显示数据,无法防止Sql注入,一般用于传入表名或order by动态参数
SQL注入
select * from ${tableName} where name = #{name}
如果表名为user; delete user; --
上述sql就会变为:
select * from user; delete user; -- where name = ?;
就会达到非法删除user表的功效!!!!
MyBatis是如何做到SQL预编译的呢?
其实在框架底层,是JDBC中的PreparedStatement类在起作用
重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。