#{}和${}的区别?

java基础面试题

在Java中,#{} 和 ${} 这两个符号通常在MyBatis或类似的ORM(对象关系映射)框架中使用,而不是直接在Java语言中使用。这两个符号在MyBatis中用于参数替换,但它们的用途和语义是不同的。

1.#{}

#{}用于预编译的sql语句中的参数替换。

Mybatis会为每一个#{}中的参数创建一个PreparedStatement的占位符(?),并设置相应的参数值。

由于是预编译的,这样可以防止sql注入攻击。

#{}中的参数名可以是Java对的属性名,也可以是Map中的Key。

实例:

2.${}

在编写MyBatis的SQL映射文件时,应该尽量使用#{}来替换参数,除非有特定的需求需要使用${}

  • ${} 用于在SQL语句中直接插入一个字符串,它不会进行预编译。
  • 使用${}时需要特别小心,因为它可能会导致SQL注入攻击。
  • ${}中的参数值会被直接替换到SQL语句中。
  • 实例:
  • 在这个例子中,${columnName}会被直接替换为传入的参数值(比如username),而#{value}则会被替换为一个?占位符,并设置相应的参数值。由于${columnName}是直接替换的,所以如果你传入了一个恶意的值(比如username' OR '1'='1),那么整个SQL语句就可能被篡改,导致SQL注入攻击。

  • 总结

  • #{} 用于预编译的参数替换,可以防止SQL注入攻击。
  • ${} 用于直接替换SQL语句中的字符串,使用时需要特别小心,因为它可能会导致SQL注入攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值