文
章
目
录
章
目
录
Java面试题:说下MyBatis中$和#有什么区别
得分点:
使用传参方式MyBatis创建SQL的不同、安全性和效率问题
标准回答如下:
在 MyBatis 中,有两种常见的方式来设置参数:使用 $
和使用 #
。这两种方式在创建 SQL 语句时有不同的行为,涉及到安全性和效率的问题。
使用 $ 设置参数:
- 当使用 $ 设置参数时,MyBatis会创建普通的 SQL 语句。
- 参数值会直接拼接到 SQL 语句中,而不是使用预编译的占位符。
- 这种方式的执行效率相对较低,因为每次执行 SQL 都要将参数值拼接到 SQL 语句中。
- 安全性方面存在潜在风险,因为参数值直接嵌入 SQL 语句,可能会受到 SQL 注入攻击的威胁。
使用 # 设置参数:
- 当使用
#
设置参数时,MyBatis会创建预编译的 SQL 语句,其中参数使用占位符来表示。 - 在执行 SQL 语句之前,MyBatis会为占位符赋值,然后执行预编译 SQL。
- 这种方式的执行效率较高,因为 SQL 语句的结构不会发生变化,只是参数值发生变化。
- 由于参数使用占位符,这种方式更加安全,能够有效防止 SQL 注入攻击。
总结:使用 #
设置参数是更安全和效率更高的方式,因为它使用预编译的 SQL 语句并保护免受 SQL 注入攻击。然而,在某些特殊情况下,如果需要动态传递列名、排序条件或其他动态 SQL 特性,可能需要使用 $
来设置参数,尽管这会降低一些安全性和效率。在这种情况下,应特别注意过滤和验证传递的参数,以减少潜在的安全风险。