MyBatis中#{}和${}的用法 說一下為什麼要寫這篇文章,最近面試有被問到,一下子想不出來有啥區別,想記錄一下加深自己的理解,同時自己也經常用MyBatis-Plus忽略了XML文件的編寫和使用,所以需要加深一下這塊的知識 一、例子 1、#{}將傳入的數據當作一個字元串,會對傳入的數據加上一個 ...
MyBatis中#{}和${}的用法
說一下為什麼要寫這篇文章,最近面試有被問到,一下子想不出來有啥區別,想記錄一下加深自己的理解,同時自己也經常用MyBatis-Plus忽略了XML文件的編寫和使用,所以需要加深一下這塊的知識
一、例子
1、#{}將傳入的數據當作一個字元串,會對傳入的數據加上一個雙引號。
比如
select * from student where student_name = #{studentName}
如果傳入的值為zhangxiangwei,那麼經過Mybatis解析完成之後的語句是
select * from student where student_name="zhangxiangwei"
2.${}將傳入的數據直接顯示生成在sql中。
比如
select ${fieldName} from user where user_age = 22
此時,傳入的參數作為要查詢的欄位,如果傳入的值為user_name,則解析成的sql為:
select user_name from user where user_age = 22
二、區別
1.#{}方式能夠很大程度上防止sql註入,${}無法防止sql註入。
2.${}方式一般用於傳入資料庫對象,例如列表和表名,#{}方式一般用來傳遞介面傳輸過來的具體數據。
3.由於#{}方式具有更高的安全行,所以能用#{}的地方儘量不要使用${}。
4.Mybatis排序時使用order by動態參數時需要註意,用${}而不是#{}。
5.#
符號(Pound Sign):
-
#
符號用於參數值的占位,會將參數值進行預編譯,併在執行SQL語句時將參數值安全地傳遞給資料庫,防止SQL註入攻擊。 -
適用於大多數情況,尤其是當參數值來自用戶輸入或不可信數據時,是更安全的選擇。
-
參數值會被自動轉義,不需要擔心特殊字元的處理。
-
使用
#
符號會產生預編譯的SQL語句,可以提高資料庫的性能,因為資料庫可以緩存相同的預編譯語句。 -
<!-- 使用#符號進行參數占位 --> <select id="getUserById" parameterType="int" resultType="User"> SELECT * FROM users WHERE id = #{userId} </select>
6.$
符號(Dollar Sign):
-
$
符號用於簡單的值替換,不進行預編譯,直接將參數的值嵌入SQL語句中。 -
適用於那些不需要參數值預編譯,且參數值是確定且可信的情況,比如用於動態拼接SQL語句的情況。
-
使用
$
符號時,需要小心防止SQL註入攻擊,需要手動處理參數值的安全性。 -
不會產生預編譯的SQL語句,可能會導致資料庫性能較低,因為每次SQL語句都會重新解析和執行。
-
<!-- 使用$符號進行簡單值替換 --> <select id="getUserByName" parameterType="string" resultType="User"> SELECT * FROM users WHERE username = '${username}' </select>
三、最後說一下 $ 動態 拼接SQL
下麵是一個實例
<select id="getUsersWithDynamicSorting" parameterType="map" resultType="User">
SELECT * FROM users
WHERE 1=1 <!-- 為了方便拼接,可以始終使用一個始終成立的條件 -->
<!-- 根據參數動態拼接排序欄位和排序順序 -->
<if test="sortField != null and sortOrder != null">
ORDER BY ${sortField} ${sortOrder}
</if>
</select>