Mybatis中#和$的区别

${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver

  • 没有办法防止sql注入
  • 传入表名

#{}是 sql 的参数占位符,MyBatis 会将 sql 中的#{}替换为?号,在 sql 执行前会使用 PreparedStatement 的参数设置方法,按序给 sql 的?号占位符设置参数值,比如 ps.setInt(0, parameterValue),#{item.name} 的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于 param.getItem().getName()

1、使用场景不同
(1) 在sql语句中,如果要接收传递过来的变量的值的话,必须使用#。因为使用#是通过PreparedStement接口来操作,可以防止sql注入,并且在多次执行sql语句时可以提高效率。

(2) $ 只是简单的字符串拼接而已,所以要特别小心sql注入问题。对于sql语句中非变量部分,那就可以使用 $ ,比如$方式一般用于传入数据库对象(如传入表名)。

(3) 如果在sql语句中能同时使用#和$的时候,最好使用#。

2.实现方式不同
(1) $作用相等于是字符串拼接
相当于使用StringBuffer的append方法将 ${username} $ 追加在select username,pass from t_login where username=后面,拼接在一起。
(2) #作用相当于变量值替换
相当于使用PreparedStement接口来对#{username}#来进行赋值操作,当传入的有 "or 1=1"的时候将会查出所有内容,这就是sql注入危险。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值