java基础面试题
在Java中,#{}
和 ${}
这两个符号通常在MyBatis或类似的ORM(对象关系映射)框架中使用,而不是直接在Java语言中使用。这两个符号在MyBatis中用于参数替换,但它们的用途和语义是不同的。
1.#{}
#{}用于预编译的sql语句中的参数替换。
Mybatis会为每一个#{}中的参数创建一个PreparedStatement的占位符(?),并设置相应的参数值。
由于是预编译的,这样可以防止sql注入攻击。
#{}中的参数名可以是Java对的属性名,也可以是Map中的Key。
实例:
2.${}
在编写MyBatis的SQL映射文件时,应该尽量使用#{}
来替换参数,除非有特定的需求需要使用${}
。
${}
用于在SQL语句中直接插入一个字符串,它不会进行预编译。- 使用
${}
时需要特别小心,因为它可能会导致SQL注入攻击。 ${}
中的参数值会被直接替换到SQL语句中。- 实例:
-
在这个例子中,
${columnName}
会被直接替换为传入的参数值(比如username
),而#{value}
则会被替换为一个?
占位符,并设置相应的参数值。由于${columnName}
是直接替换的,所以如果你传入了一个恶意的值(比如username' OR '1'='1
),那么整个SQL语句就可能被篡改,导致SQL注入攻击。 -
总结:
#{}
用于预编译的参数替换,可以防止SQL注入攻击。${}
用于直接替换SQL语句中的字符串,使用时需要特别小心,因为它可能会导致SQL注入攻击。