表兄弟 #, $ 的区别"/>
Mybatis 的表兄弟 #, $ 的区别
Mapper
当 String date = " '2019-12-10' ";
Mapper.xml
当使用如下查询时是查不到数据的 (String date = "2019-12-10" 也是查不到的)
select * from order where date IN (#{date});
修复方案 :
方法一:
使用 $ (注意: 这是不安全的, 存在 sql 注入的风险)
select * from order where date IN (${date});
方法二:
Mapper传入 List<String> date 后使用 foreach函数
select * from order where date IN
<foreach collection="date" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
总结:
1、#{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号;
2、${ }是字符串替换, MyBatis在处理${ }时,它会将sql中的${ }替换为变量的值,传入的数据不会加两边加上单引号。
注意:使用${ }会存在sql注入的风险,不利于系统的安全性!
SQL注入:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。常见的有匿名登录(在登录框输入恶意的字符串)、借助异常获取数据库信息等
应用场合:
1、#{ }:主要用户获取DAO中的参数数据,在映射文件的SQL语句中出现#{}表达式,底层会创建预编译的SQL;
2、${ }:主要用于获取配置文件数据,DAO接口中的参数信息,当$出现在映射文件的SQL语句中时创建的不是预编译的SQL,而是字符串的拼接,有可能会导致SQL注入问题.所以一般使用$接收dao参数时,这些参数一般是字段名,表名等,例如order by ${column}。
更多推荐
Mybatis 的表兄弟 #, $ 的区别
发布评论