MyBatis中 #{} 和 ${} 的区别

#{} 解析参数

先来看下面这段SQL:

delete from  
ups_role_permission_dataparams  
where role_id = #{roleId,jdbcType=INTEGER}

在MyBatis中,我们常常传递字符串,我们设置的参数#{name}在大部分情况下MyBatis会用创建预编译的语句,然后为它设置值。SQL在解析的时候会加上” “当成字符串来解析,如这里 role_id = “roleid”。#{} 能够很大程度上防止sql注入

${} 内容直出

用 ${} 传入数据直接显示在生成的SQL中,如上面的语句,如果用role_id = ${roleId, jdbcType=INTEGER},那么sql在解析的时候值为role_id = roleid,执行时会报错。
${}方式容易被SQL注入

使用场景

首先,能用#{}时尽量用#{}

但是下面的一些场景中,要使用${}:

① MyBatis排序时使用order by动态参数时需要注意,使用${}而不用#{}

② ${} 一般用入传入数据库对象,比如数据库表名。有时候我们需要的是传递SQL语句的本身,而不是SQL所需要的参数。例如,在一些动态表格中,根据某些列进行排序,或者传递列名给SQL都是比较常见的场景。例如,在程序中传递columns=”col1, col2, col3…”给SQL,让其组装为SQL语句,不想将它们处理为普通的参数,那么就可以这样做:

select ${columns} from t_tablename

这样MyBatis就不会帮我们转译columns,变为直出,而不是作为SQL的参数进行设置了。但是这样对SQL而言是不安全的,拥有了灵活性的同时,也需要我们自己去控制参数以保证SQL运转的正确性和安全性。

参考文献
[1] 杨开振. 深入浅出 MyBatis 技术原理和实战[Z]. 北京: 电子工业出版社,2016.
[2] 罗卜丝粉. ${}和#{}的区别[EB/OL]. https://blog.csdn.net/zouxucong/article/details/52837387.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值