使用#{}传入参数,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
两个操作 先查询表 然后删除表,这样就会对数据库造成损伤,所以能用#{}就尽量用#{}。。。