花店網(wǎng)站模板下載百度極速版
1. #{id}(參數(shù)占位符)
-
作用: 使用?#{id} 時,MyBatis 會將 id 參數(shù)綁定為 JDBC 的參數(shù)。這種方式能夠有效防止 SQL 注入攻擊,因為它會進行參數(shù)的預(yù)處理,將參數(shù)值作為數(shù)據(jù)類型的綁定,而不是直接插入到 SQL 語句中。
-
用法示例:
@Select("SELECT * FROM users WHERE id = #{id}") User getUserById(@Param("id") int id);
在這個示例中,id 的值會被作為參數(shù)綁定,而不是直接拼接到 SQL 語句中。
2.?${id}(字符串替換)
-
作用: 使用 ${id} 時,MyBatis 會直接將 id 的值替換到 SQL 語句中,這意味著該值是直接拼接到 SQL 語句字符串的。這種方式在某些情況下是有用的,例如動態(tài)表名或列名的場景。
-
短暫使用示例:
@Select("SELECT * FROM ${tableName} WHERE id = #{id}") User getUserById(@Param("tableName") String tableName, @Param("id") int id);
在這個示例中,${tableName} 將被直接替換為傳入的字符串,這對于動態(tài)表名是必要的,但同時它也存在 SQL 注入的風險,可能會導(dǎo)致安全問題。
總結(jié)
- 使用#{} 時,MyBatis 會自動處理參數(shù),以保護 SQL 執(zhí)行的安全性,適用于大多數(shù)場景(尤其是插入、更新、刪除等操作)。
- 使用 ${} 時,參數(shù)會被直接替換到 SQL 語句中,適用于動態(tài) SQL 生成(如動態(tài)表名),但需要小心處理輸入,以避免 SQL 注入。
因此,在判斷何時使用這兩種方式時,安全性應(yīng)該是優(yōu)先考慮的因素。建議盡可能使用 #{} 除非確實需要使用 ${}。