#{}与${}的区别

#{}与${}的区别

技术杂谈小彩虹2021-08-22 17:38:17160A+A-

默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义。

示例1:

执行SQL:Select * from emp where name = #{employeeName}

参数:employeeName=>Smith

解析后执行的SQL:Select * from emp where name = ?

执行SQL:Select * from emp where name = ${employeeName}

参数:employeeName传入值为:Smith

解析后执行的SQL:Select * from emp where name =Smith

说明:

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.

2. 将传入的数据直接显示生成在 s q l 中。如: o r d e r b y 将传入的数据直接显示生成在sql中。如:order by {user_id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order by id.

综上所述,{}方式会引发SQL注入的问题、同时也会影响SQL语句的预编译,所以从安全性和性能的角度出发,能使用#{}的情况下就不要使用{}。

${}在什么情况下使用呢?

有时候可能需要直接插入一个不做任何修改的字符串到SQL语句中。这时候应该使用${}语法。

比如,动态SQL中的字段名,如:ORDER BY ${columnName}

  1. Select * from emp where name = {employeeName} ORDER BY {columnName}

由于 仅仅是简单的取值 , 所以以前 s q l 注入的方法适用此处 , 如果我们 o r d e r b y 语句后用了 {}仅仅是简单的取值,所以以前sql注入的方法适用此处,如果我们order by语句后用了 {},那么不做任何处理的时候是存在sql注入危险的。

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们