mybatis中的#和$的区别

来源:互联网 发布:java用ftp上传文件 编辑:程序博客网 时间:2024/06/08 18:57

#相当于对数据 加上 双引号,$相当于直接显示数据


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注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

原创粉丝点击