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