MyBatis mapper文件中的变量引用方式#{}与${}的差别

来源:互联网 发布:c语言基础入门知识 编辑:程序博客网 时间:2024/06/16 09:27

使用#{}传入参数,sql语句解析时会加上“,当成字符串去解析
例如:select * from student where id=#{id}
相当于 select * from student where id="1001"

使用${}传入参数,sql解析时什么都不会加,直接生成sql语句
例如:select * from student where id=${id}
相当于 select * from student where id=1001

使用#{}可以防止sql注入也就是语句的拼接。
${}使用在order by排序语句中 通常这些使用$的字符串是基本上不会变的。
能用#就尽量不要用${}原因是:

会引起sql注入,${}会直接参与sql编译,影响sql语句的预编译。。
我总结的两者的根本区别就是一个带引号一个不带引号。。

例子:

select * from student where name=#{name}select * from student where name=${name}

两者编译完后都会变成:select * from student where name="zs"

但是两者在预编译处理时的步骤是不一样的

使用#{}在预编译处理时是把参数部分用一个占位符?来代替变成:

select * from student where name=?

而使用${}则是简单的字符串的替换,在动态解析的阶段会被解析成:

selecct * from student where name="zs"

{}的参数替换是发生在DBMS中,而${}则是发生在动态解析时。

如果表明变为user;delete user;

那么 select * from ${tableName} where name=#{name}

就会变成 select * from user; delete user 两个操作 先查询表 然后删除表,这样就会对数据库造成损伤,所以能用#{}就尽量用#{}。。。

阅读全文
0 0