1 #是將傳入的值當做字符串的形式,eg:select id,name,age from student where id =#{id},當前端把id值1,傳入到後臺的時候,就相當於 select id,name,age from student where id ='1'.
2 $是將傳入的數據直接顯示生成sql語句,eg:select id,name,age from student where id =${id},當前端把id值1,傳入到後臺的時候,就相當於 select id,name,age from student where id = 1.
#{}: 解析爲一個 JDBC 預編譯語句(prepared statement)的參數標記符,一個 #{ } 被解析爲一個參數佔位符 。預編譯的話sql語句的格式已經定義好了,缺的就是要傳入進去的參數,所以可以防止sql注入
${}: 僅僅爲一個純碎的 string 替換,在動態 SQL 解析階段將會進行變量替換。就比如說下面這條sql;
eg:SELECT * FROM users WHERE name = `"
+ userName +
"` and pw = `"+ passWord +"`;在userName和passWord地方需要傳入用戶名和密碼進行替換,如果傳入的用戶名和密碼是:userName = "1' OR '1'='1"; passWord = "1' OR '1'='1";這樣的,那麼這條sql就變成了:
SELECT * FROM users WHERE name = '1' OR '1'='1' and pw = '1' OR '1'='1';如果用戶名是正確還是錯誤,始終會爲true;因此就可以跳過用戶名和密碼的驗證.