Java的Mybatis框架中#{}与${}使用心得
在MyBatis框架中,#{}和${}都是用来动态地向SQL语句中插入值的,但它们的处理方式和用途有所不同
#{}
安全:#{}是预编译处理,能够有效防止SQL注入。它会将参数看作一个占位符,在SQL执行前,MyBatis会使用PreparedStatement参数化的方式处理这些值,即将参数替换为问号(?),然后由数据库驱动程序负责处理参数化的过程。
这样可以确保传入的参数被正确转义,避免SQL注入的风险。
用法示例:在映射文件中,如果你看到如:
SELECT * FROM table WHERE id = #{id}
这样的语句,这里的#{id}会被实际传入的id值安全地替换。
${}
不安全:${}不会进行预编译处理,而是直接进行字符串替换。这意味着传入的参数将会原样拼接到SQL语句中,如果参数中含有恶意代码,可能会导致SQL注入攻击。
用途:尽管因为安全性问题不推荐用于包含用户输入的参数,但它在某些特定场景下非常有用,比如动态表名、列名或者SQL片段等,这些内容不是用户提供的,而是程序内部确定的,使用因为安全性问题不推荐用于包含用户输入的参数,但它在某些特定场景下非常有用,比如动态表名、列名或者SQL片段等,这些内容不是用户提供的,而是程序内部确定的,使用{}可以直接拼接SQL。
用法示例:若需要根据某个条件动态生成表名,可能会这样写
SELECT * FROM
t
a
b
l
e
N
a
m
e
W
H
E
R
E
.
.
.
,这里
{tableName} WHERE ...,这里
tableNameWHERE...,这里{tableName}会被其对应的变量值直接替换到SQL中。
总结
通常情况下,当你需要传递参数到SQL查询中时,推荐使用#{}来防止SQL注入,保护应用的安全性。
如果你需要拼接SQL片段或者动态生成SQL结构部分(而非查询条件),可以使用${},但需谨慎使用,确保不会引入安全风险。
了解更多知识请戳下:
@Author:懒羊羊