網上的答案是:#{}是預編譯處理,${}是字符串替換。mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值;mybatis在處理${}時,就是把${}替換成變量的值。使用#{}能夠有效的防止SQL注入,提升系統安全性。面試

對於這個題目我感受要抓住兩點:
(1)$符號通常用來看成佔位符,常使用Linux腳本的人應該對此有更深的體會吧。既然是佔位符,固然就是被用來替換的。知道了這點就能很容易區分$和#,從而不容易記錯了。
(2)預編譯的機制。預編譯是提早對SQL語句進行預編譯,而其後注入的參數將不會再進行SQL編譯。咱們知道,SQL注入是發生在編譯的過程當中,由於惡意注入了某些特殊字符,最後被編譯成了惡意的執行操做。而預編譯機制則能夠很好的防止SQL注入。sql