#{}是預編譯處理,${}是字符串替換。mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值,最后注入進去是帶引號的;mybatis在處理${}時,就是把${}替換成變量的值。使用#{}可以有效的防止SQL注入,提高系統安全性。
例如:
#是將傳入的值當做字符串的形式,eg:select id,name,age from student where id =#{id},當前端把id值1,傳入到后台的時候,就相當於 select id,name,age from student where id ='1'.
$是將傳入的數據直接顯示生成sql語句,eg:select id,name,age from student where id =${id},當前端把id值1,傳入到后台的時候,就相當於 select id,name,age from student where id = 1.
對於這個題目我感覺要抓住兩點:
(1)$符號一般用來當作占位符,常使用Linux腳本的人應該對此有更深的體會吧。既然是占位符,當然就是被用來替換的。知道了這點就能很容易區分$和#,從而不容易記錯了。
(2)預編譯的機制。預編譯是提前對SQL語句進行預編譯,而其后注入的參數將不會再進行SQL編譯。我們知道,SQL注入是發生在編譯的過程中,因為惡意注入了某些特殊字符,最后被編譯成了惡意的執行操作。而預編譯機制則可以很好的防止SQL注入。
