1. 程式人生 > >Mybatis中${ }與#{ }的區別

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注入。

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