用#{}和 ${}获取传参的区别(第一次写博客,写博客的目的是用于在学习过程中遇到的困惑,理解后并记录下来,以便忘记了,可以方便学习。)

用#{}和 ${}获取传参的区别

其实区别很简单的,举两个例子大家就会明白的。
①写一句SQL-例如:

select * from student where name= "pcqstart";

这句话而言,需要写成

select * from ${tableName} where user_code = #{userName}

所以,$符是直接拼成sql的 ,#符则会以字符串(加“”双引号)的形式 与sql进行拼接。
②例子:
说明:#{}能够更安全的取出参数, $ {}取出的参数不安全,尽量不要使用${}取参数
原因:

A:select * from table where name = ${parameter}
B:select * from table where name = #{parameter}

若parameter的值为: ‘’ or 1=1
A的sql就解析为

select * from student where name = '' or 1=1  //注入成功,

// 因此后面就可以执行or 1=1,执行成功,这就是sql注入。
B的sql就解析为

select * from student where name = ?;
select * from student where name =' '' or 1=1 ' //注入失败

// 这里’ ‘’ or 1=1 ’ 就成为了一个字符串参数,而没有将or、=解析成为sql的运算符。

总结:
1、$ {}:
①直接获取传输过来的内容,直接输出;
②向数据库输入表名或者列名时才使用。
③配置DataSources数据源等信息时,也是使用${};
2、#{}:
①解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数?占位符 。
3、说明:
①如果为int,则直接输入int型,如果为字符串型则直接加“”后输入;
②’or 1=1 #'将作为一个字符串,=将不再作为运算符。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值