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中#{}与${}的区别)