详解#{}和${}的区别和优势

简单区分两者关系:
#{}里面的值相当于加上双引号。也就是说它进行了sql预编译
${}里面的值就相当于直接取值。也就是没有进行sql预编译

  • #{}的例子
select * from t_user where username = #{username}
//相当于 select * from t_user where username = 'username'
  • ${}的例子
select * from t_user where username = ${username}
//相当于 select * from t_user where username = username

很明显使用${}很可能造成sql注入问题,假设一个登录需求,我们需要验证用户名和密码登录如果我们使用 ${},那岂不是只要知道用户名就可以随意登录系统了吗!但是如果我们使用#{}就可以进行sql预编译,避免了sql注入问题!

//sql编译之后为:select * from t_user where username = 用户名 and password = 1 or 1 = 1
select * from t_user where username = ${username} and password = ${1 or 1 = 1}

//sql编译之后为:select * from t_user where username = '值' and password = '1 or 1 = 1'
select * from t_user where username = #{username} and password = #{1 or 1 = 1}

像使用Mybatis的时候进行排序(ORDER BY ${age})需要动态参数时注意,用 ${}而不是#{}

最后总结一个下两者区别:

  1. #{}是进行sql预编译的,可以防止sql注入问题
  2. ${}是不进行sql预编译的,不能防止sql注入问题
  3. $方式一般用于传入数据库对象,例如传入表名.
  4. 一般能用#{}就不要使用${}
  5. 当我们使用ORDER BY进行排序的时候使用${}而不是使用#{}

猜你喜欢

转载自blog.csdn.net/weixin_45550128/article/details/106576785