#{}与${}的区别
-
#{}一定不能写在引号里面,${}一定要写在引号里面
-
如果是pojo、map类型的参数,无论是#{}还是${}里面都是些属性名
-
如果是简单类型的参数,#{}里面可以写任意字符串,但是${}里面只能写value(以前的版本)
-
#{} 能防止sql 注入,${} 不能防止sql 注入
实验
准备数据库
Mapper.xml
<select id="findAll" resultType="cn.appmy.pojo.User" parameterType="String">
select * from tb_user where mobile=#{value}
</select>
传参查询
List<User> userList = userDao.findAll("51515");
for (User user : userList) {
System.out.println(user);
}
打印结果
传参查询
List<User> userList = userDao.findAll("51515' and password='0");
for (User user : userList) {
System.out.println(user);
}
当使用#{}进行SQL注入查询时,MyBatis无法有效查询打印数据
这时保持Java语句不变,改变mapper.xml
<select id="findAll" resultType="cn.appmy.day0220.pojo.User" parameterType="String">
select * from tb_user where mobile= '${value}'
</select>
打印结果
总结:#{}不是简单的拼接SQL语句,#{}可以有效的防止SQL注入;而${}不能防止SQL注入。
#{}为什么防注入?
- 使用#{}引入参数,其实是先使用“?”占位符,然后再设置参数。 #{} 不会改变原本的SQL规则,不管占位符里面的什么字符都不影响SQL原本的查询结构。占位符 “?” 处会被完整替换,因此可以防止SQL注入。
- 而使用${}引入参数的话,是直接拼接SQL语句。