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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Xiaokm/article/details/79685298

#{} 解析参数

先来看下面这段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.

没有更多推荐了,返回首页