(1)n#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
(2)n${}表示拼接sql串,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
注:
(1)简单类型就是不是自己定义的类型
(2)模糊查询:'%${value}%' 不可漏掉单引号
他们之间的区别用最直接的话来说就是:#相当于对数据 加上 双引号,$相当于直接显示数据。
1、#对传入的参数视为字符串,也就是它会预编译,select * from user where name = #{name},比如我传一个csdn,那么传过来就是 select * from user where name = 'csdn';
2、$将不会将传入的值进行预编译,select * from user where name=${name},比如我穿一个csdn,那么传过来就是 select * from user where name=csdn;
3、#的优势就在于它能很大程度的防止sql注入,而$则不行。
比如:用户进行一个登录操作,后台sql验证式样的:select * from user where username=#{name} and password = #{pwd},
如果前台传来的用户名是“wang”,密码是 “1 or 1=1”,用#的方式就不会出现sql注入,而如果换成$方式,
sql语句就变成了 select * from user where username=wang and password = 1 or 1=1。这样的话就形成了sql注入。
4、MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。
重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。