1.#{}是预编译处理,可以有效的防止SQL注入.底层实现依靠PreparedStatement 预编译的时候会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值的时候都会加上两个单引号
2.${}直接字符串替换,所以会有sql注入的风险.like,order by,where
3.两者都可以使用的时候优先用#{},比如where查询,like查询用#{}.
4.order by字段**,from**表名称,只能用${}.
5.#{}可以对数据类型进行自动转换,而${}将所有的数据都当做字符串处理
简单回答
1.#{}可以防止sql注入
2.能用#{}不用
3.
o
r
d
e
r
b
y
字
段
,
f
r
o
m
表
名
称
,
只
能
用
{} 3.order by 字段,from 表名称,只能用
3.orderby字段,from表名称,只能用{}
辅助理解
#where情况
参数 = "itheima or 1=1"
1.用#{}
select * from foo where bar = #{xxxx}
select * from foo where bar = ?
select * from foo where bar = 'itheima or 1=1' --sql注入失败
##用${}
select * from foo where bar = ${xxxx}
select * from foo where bar = itheima or 1=1; --sql注入成功
#like情况
参数 = "' or '1=1"
##用#{}
select * from foo where bar like '%#{xx}%’
select * from foo where bar like '%?%’
select * from foo where bar like '%'' or '1=1'%' --语法错误,sql注入失败
##用${}
select * from foo where bar like '%${xx}%’
select * from foo where bar like '%' or '1=1%’ --sql注入成功
#order情况
参数 = "name"
##用#{}
select * from foo order by #{xxxx}
select * from foo order by ?
select * from foo order by 'name' --没法排序,没有结果
##用${}
select * from foo order by ${xxxx}
select * from foo order by name --ok
##用${} 可能引起sql注入
比如
[SQL]select * from aaa order by id and(updatexml(1,concat(0x7e,(select system_user())),0));
[Err] 1105 - XPATH syntax error: '~root@localhost'
#from情况 不能使用#{}
参数 = "foo"
##用#{}
select * from #{xxx};
select * from ?;
select * from 'foo'; --语法错误
##用${}
select * from ${xxx};
select * from foo; --ok