在使用mybatis的时候我们会使用到#{}和${}这两个符号来为sql语句传参数
那么这两者有什么区别呢?
1.#{}是预编译处理,是占位符,${}是字符串替换,是拼接符
2.Mybatis在处理#{}的时候会将sql中的#{}替换成?号,调用PreparedStatement来赋值
如:select * from user where name = #{userName};设userName=tjh
看日志我们可以看到解析时将#{userName}替换成了 ?
select * from user where name = ?;
然后再把tjh放进去,外面加上单引号
3.Mybatis在处理 的时候就是把 {}的时候就是把 的时候就是把{}替换成变量的值,调用Statement来赋值
如:select * from user where name = #{userName};设userName=tjh
看日志可以发现就是直接把值拼接上去了
select * from user where name = tjh;
这极有可能发生sql注入;
4.#{}的变量替换是在DBMS中、变量替换后,#{}对应的变量自动加上单引号
5.${}的变量替换实在DBMS外、变量替换后, ${}对应的变量不会加上单引号
6.使用#{}可以有效的防止sql注入,提高系统的安全性
下面举一个简单的sql注入问题:
设数据库的user表中用户的userName为:tjh, password为:123,
用户登录时,当我们用${}进行查询时:
select count(*) from user where userName = ${} and password = ${}
这显示可以进行正常的登录,但是当有人不知道账号的密码,恶意登录时,可以这样做:
这时,实际执行的sql语句是:
select count(*) from user where userName = 'tjh' and password = 1 or 1 = 1
依然可以登录成功,这就是sql注入最简单的例子,但是当使用#{}时,会自动将输入的入参加上单引号,就不会发生上面的情况。
参考自:https://blog.csdn.net/m0_53611007/article/details/120955414