ssm-#{}和${}的区别是什么

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.orderbyfrom{}

辅助理解

#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

PreparedStatement和Statement的介绍

java中PreparedStatement和Statement详细讲解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值