原文链接:mybatis中#{}和${}的区别

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
  
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
  
3. #方式能够很大程度防止sql注入。
  
4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.
  
6.一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

mybatis本身的说明:

String Substitution

By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this:

ORDER BY ${columnName}
Here MyBatis won't modify or escape the string. NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or always perform your own escapes and checks.

从上文可以看出:

1. 使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值,执行sql类似下面的:

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);

这样做的好处是:更安全,更迅速,通常也是首选做法。

2. 不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

此时MyBatis 不会修改或转义字符串。

这种方式类似于:

Statement st = conn.createStatement();

ResultSet rs = st.executeQuery(sql);

这种方式的缺点是: 以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的 SQL 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。

最新文章

  1. Windows 10 安装 Sql Server 2014 反复提示需要安装 .NET Framework 3.5 SP1 的解决方案
  2. C语言实现2个大数相加。
  3. Glide 魔法般的自定义扩展
  4. SetForegroundWindow激活窗口
  5. HBase配置项详解
  6. 网站实时协作JavaScript库 TogetherJS
  7. WPF Control Hints - TabControl : 怎么修改整个tab header的margin?
  8. Android开发UI之android:gravity / android:layout_Gravity,android:padding / android:layout_margin属性区分
  9. UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]
  10. SAP-MM:发票、贷方凭证、事后借记、后续贷记
  11. uva 10453 - Make Palindrome(dp)
  12. MySQL推出Applier,可实时复制数据到Hadoop
  13. python写一个DDos脚本(DOS)
  14. 异常驱动的开发(Exception-Driven Development)
  15. 关于button去掉自带阴影效果的方法
  16. Dubbo 源码分析 - 集群容错之 Directory
  17. 6.7 使用show profile 进行sql分析
  18. c++ 模板相关
  19. byte以及UTF-8的转码规则
  20. BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)

热门文章

  1. [C++] const和mutable关键字使用方法
  2. ssm框架中,项目启动过程以及web.xml配置详解
  3. python 图片格式转换png转jpg,如何利用python给图片添加半透明水印
  4. spring AOP的使用步骤
  5. 【E2EL5】A Year in Computer Vision中关于图像增强系列部分
  6. thinkphp5---安装到宝塔出现Warning: require(): open_basedir错误
  7. spring boot集成mybatis分页插件
  8. Mysql关键字之Group By(一)
  9. 基因型数据正负链怎么翻转(snp flip)
  10. 【翻译】Flink Table Api & SQL —Streaming 概念 —— 表中的模式匹配 Beta版