Mybatis中#{}与${}的区别

#{} 与 ${}

  • {} 方式能够很大程度防止sql注入

  • ${} 方式无法防止Sql注入

这个大家应该都知道,我来说说我实际项目中遇到的问题。

背景介绍

数据展示中需要做动态排序,那么就无法避免要自己去动态的拼接 sql,根据条件的不同组合成不同的 sql。此前虽然很清楚的知道 #{} 与 ${} 的区别,但是从来都只用 #{}(尽量用这个),因此导致花费了大量时间寻找问题的所在。

栗子

{} 传入,sql语句解析是会加上"",下面第一个栗子的用法是没有问题的

String name = "张三";

select * from user where name = #{name}

// 解析后的 sql

select * from user where name = '张三'

但是,如果是时间排序的话就会出现问题

// DESC 降序排序
String order = "DESC";

order by date #{order}

// sql 就会变成这样,然后就出错了

order by date 'DESC'

这种场景下,我们就需要使用 ${}

// DESC 降序排序

String order = "DESC";

order by date ${order}

// sql 语句接下后变成这样,和我们预期效果一样,没有问题

order by date DESC

个人主页有联系方式,不足之处,欢迎指出。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 刚开始用 MyBatis 时,就发现有的地方用 #,有的地方用 $,但一直都没在意,直到程序出 Bug 了,才去了...
    小道萧兮阅读 481评论 0 1
  • Q:#与$的区别是什么?A:#会在sql中使用占位符,有效得防止了sql注入,$会把参数直接拼接到sql中可能会引...
    nanyang_lf阅读 687评论 1 0
  • 1 #是将传入的值当做字符串的形式,eg:select id,name,age from student wher...
    老街老街阅读 721评论 0 0
  • 你会不会觉得要学习的东西很多? 你会不会觉得可以学习的渠道很多? 你会不会觉得知识点很多无法选择? 你是否愿意学习...
    Aimee1314阅读 138评论 0 0
  • 今天去拆线,医生说补充的牙龈长的不错,过一个月后更好。很开心。不过医生说至少还有三次手术要做,因为没有更多的组织可...
    酱酱大阅读 177评论 0 0