Mybatis中${ }與#{ }的區別

今天看BBS,看到有關於面試問題的一個帖子,裏面提到了關於Mybatis中的#{}和${}的區別,這裏也簡單總結記錄下。

#{ }:預編譯處理,字符串替換,進行類型匹配

Mybatis處理#{}時,會將SQL語句中的變量#{}替換成?號,調用PreparedStatement的set方法來賦值,有效的防止SQL注入。
場景:添加、修改、帶條件查詢(where)
e.g:select * from user where userId = #{userId}

${ }:字符串拼接,不進行類型匹配

Mybatis處理${}時,將${}作爲非變量的值。
場景:對應SQL語句中的非變量部分,一般傳入數據庫對象常量,group by、order by、表名、字段名。
e.g:select count(*) from user group by ${param}

預編譯機制:

預編譯是提前對SQL語句進行預編譯,而其後注入的參數將不會再進行SQL編譯。
SQL注入是發生在編譯的過程中,因爲惡意注入了某些特殊字符,最後被編譯成了惡意的執行操作。
因此,預編譯機制則可以很好的防止SQL注入。

對於#{ }、${ },分清場景使用即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章