向sql语句中传递的可变参数 #{ } 和 ${ }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/newbie0107/article/details/102595351

#{ }

预编译 #{ }: 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号,能够很大程度防止sql注入


这是我们最经常使用的方法,之前我们介绍的例子都是使用的 #{ }
在这里插入图片描述
我们来看看其执行过程中是什么样形式
在这里插入图片描述
在这里插入图片描述

看到这里我们是不是就能想到我们在 JDBC连接MySQL数据库 中我们使用的 PreparedStatement
在这里插入图片描述


${ }

传值 ${ }: 传入的数据直接显示生成在 sql 语句中,无法防止sql注入


现在我们将上述的例子中的 #{ } 改成 ${ } 再来进行测试,我们就会发现直接报错了
在这里插入图片描述
在这里插入图片描述
因为这里直接将其拼接到 sql 语句中,sex = 男就肯定会报错了,这里既然是拼接的话,我们就完全可以将其传入一个带引号的字符串进去才可以进行。
在这里插入图片描述

这里是不是很类似于 JDBC连接MySQL数据库 中我们使用的 Statement
在这里插入图片描述



所以我们发现其实所谓的预编译也就是在使用了占位符,最后就是用了个引号将我们的参数就包含起来了,而不是简单的进行拼接。

这里就可以有效的避免我们的 sql 注入,如我们在校验登录密码的时候,可以预防恶意的想在 where 条件后拼接上 or 1 = 1 来通过验证等。


那么我们是不是就可以丢弃 ${ } 方法呢?当然也不是,在许多的一些情况下,我们还是会使用到我们的 ${ },比如排序时使用 order by 和 in 操作, 用 $ 而不是 #

还有就是我们在一些情况下进行拼接 sql 语句进行执行的时候,当我们需要拼接其表名或列名时,也是需要使用 ${ }

猜你喜欢

转载自blog.csdn.net/newbie0107/article/details/102595351