mybatis 框架使用好处之一就是可以动态的改变 sq l语句,而动态的 sql 语法 #{ } 和 ${ } 则有所不同。
#:因为mybatis是基于 jdbc 封装的,# 解析为 jdbc 预编译(preparedstatement)的参数标记符,一个 #{} 解析成一个参数占位符。
$:是字符串的替换,在动态 sql 解析阶段会进行变量替换。
注意平时优先使用 #{},因为使用 ${} 会引起 sql 注入。
因为在 mybatis 在处理 # 时,会调用 PreparedStatement 的 set 系列方法来赋值, 并且可以安全地设置参数(=?)的值。因为 sql 语句已经预编译好了,传入参数的时候,不会重新生产 sql 语句,安全性高。处理 $ 时,就是把 ${} 替换成变量的值。
例:select * from emp where ename = '用户名',如果使用 $ 入参,用户名被传入例如 ‘smith or 1 = 1’,那无论 ename 是否匹配都能查到结果。
注意:
如果在特定场景下,使用诸如 order by ${ param },这时候就可以使用 $
总之使用 #{} 可以有效的防止 SQL 注入,提高系统安全性。
水平有限,若有问题请留言交流!
互相学习,共同进步:) 转载请注明出处谢谢!