#{}和${}的区别
Posted 孤独斗士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#{}和${}的区别相关的知识,希望对你有一定的参考价值。
#和$的区别
数据库数据
图片:
一、先说#
例:mapper.xml如下
1、#是一个占位符,相当于JDBC中的一个?,会对一些敏感的字符进行过滤
2、#底层采用的是PreparedStatement,会预编译(主要是里面的setString方法,对一些特殊的字符,例如’'单引号,会在值后面加上一个\\右斜线进行转义,让值无效),因此不会产生sql注入
例:
请求:
http://localhost:8001/payment/get?name=‘小明’
debug运行查看
value = char[4]@9719 [‘, 小, 明, ‘] 0 = ‘’’ 39 1 = ‘小’ 23567 2 = ‘明’ 26126 3 = ‘’’ 39
结果:
“code”:444,“message”:“查询数据失败,name:‘小明’”,“data”:null
3、#不会产生字符串拼接,
4、#在使用时会根据传递进来的值来选择是否加上双引号(例:#name 传入sql中就是"小明"),因此我们在传递参数时一般都是直接传递,不用加双引号
例:
http://localhost:8001/payment/get?name=小明
5、在传递参数时#中可以传递任意值
例:
得出的结果都是:
“code”:200,“message”:“查询数据成功,serverPort:8001”,“data”:“id”:1,“serial”:“xm”,“name”:“小明”
注意在dao层改一下
Payment getPaymentByName2(@Param(“随便写”) String name);
6、#的应用场景是为sql语句中where字句传递条件值
二、再说
1
、
1、
1、匹配的是真是传递的值,传递后会与sql语句进行字符拼接
2、$会与其他sql进行字符串拼接,不能预防sql注入
例:mapper.xml如下
请求:
http://localhost:8001/payment/get?name=小明
报错:
SQL: select * from payment where name = 小明;
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘小明’
in ‘where clause’
3、
不会主动加
"
"
双引号,需要我们手动加入例:请求:
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
8001
/
p
a
y
m
e
n
t
/
g
e
t
?
n
a
m
e
=
"
小明
"
结果:
"
c
o
d
e
"
:
200
,
"
m
e
s
s
a
g
e
"
:
"
查询数据成功
,
s
e
r
v
e
r
P
o
r
t
:
8001
"
,
"
d
a
t
a
"
:
"
i
d
"
:
1
,
"
s
e
r
i
a
l
"
:
"
x
m
"
,
"
n
a
m
e
"
:
"
小明
"
4
、
不会主动加""双引号,需要我们手动加入 例: 请求: http://localhost:8001/payment/get?name="小明" 结果: "code":200,"message":"查询数据成功,serverPort:8001","data":"id":1,"serial":"xm","name":"小明" 4、
不会主动加""双引号,需要我们手动加入例:请求:http://localhost:8001/payment/get?name="小明"结果:"code":200,"message":"查询数据成功,serverPort:8001","data":"id":1,"serial":"xm","name":"小明"4、作为普通传值,不能进行字符过滤
5、$的应用场景是为了传递一些需要参与SQL语句语法生成的值
例:
请求:
http://localhost:8001/payment/get?table=payment
结果:
“code”:200,“message”:“查询数据成功,serverPort:8001”, “data”:[ “id”:1,“serial”:“xm”,“name”:“小明”, “id”:2,“serial”:“xh”,“name”:“小红”, “id”:3,“serial”:“zs”,“name”:“张三”, “id”:4,“serial”:“ls”,“name”:“李四”, “id”:5,“serial”:“ww”,“name”:“王五”, “id”:6,“serial”:“zl”,“name”:“赵六”, “id”:7,“serial”:“tq”,“name”:“田七”, “id”:8,“serial”:“wf”,“name”:“王妃”]
三、最后统一总结一下(感觉自己写的乱糟糟的o(╥﹏╥)o)
1、#是一个占位符,KaTeX parse error: Expected 'EOF', got '#' at position 12: 只是普通传值 2、#̲在使用时,会根据传递进来的…则不会,我们需要手动加
3、在传递一个参数时,我们在#中可以写任意值
4、#针对SQL注入进行了字符过滤,KaTeX parse error: Expected 'EOF', got '#' at position 26: …值,并没有考虑到这些问题 5、#̲的应用场景是为给SQL语句…的应用场景是为了传递一些需要参与SQL语句语法生成的值
achannelfor和of的区别
参考技术A 这里名词 advocate = 主张者,提倡者,拥护者advocate for 和 advocate of 的区别很细微,也常被互换。
advocate for sth./sb
有 为某机构/主张/思想做拥护者/提倡者/辩护者 之意 (for = 为 .. 而做某事)
advocate of sth/sb
某机构/某主张的提倡者 (of sth = 某东西的 ...)
以上是关于#{}和${}的区别的主要内容,如果未能解决你的问题,请参考以下文章