#相當於對資料 加上 雙引號,$相當於直接顯示資料
1. #將傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號。如:order by #user_id#,如果傳入的值是111,那麼解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id".
2. $將傳入的資料直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那麼解析成sql時的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id.
3. #方式能夠很大程度防止sql注入。
4.$方式無法防止sql注入。
5.$方式一般用於傳入資料庫物件,例如傳入表名、欄位名.
6.一般能用#的就別用$.
mybatis排序時使用order by 動態引數時需要注意,用$而不是#
字串替換
預設情況下,使用#{}格式的語法會導致mybatis建立預處理語句屬性並以它為背景設定安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時你只是想直接在sql語句中插入乙個不改變的字串。比如,像order by,你可以這樣來使用:
order by $
這裡mybatis不會修改或轉義字串。
重要:接受從使用者輸出的內容並提供給語句中不變的字串,這樣做是不安全的。這會導致潛在的sql注入攻擊,因此你不應該允許使用者輸入這些字段,或者通常自行轉義並檢查。
使用#{}意味著使用的預編譯的語句,即在使用jdbc時的preparedstatement,sql語句中如果存在引數則會使用?作佔位符,我們知道這種方式可以防止sql注入,並且在使用#{}時形成的sql語句,已經帶有引號,例,select * from table1 where id=# 在呼叫這個語句時我們可以通過後台看到列印出的sql為:select * from table1 where id='2' 加入傳的值為2.也就是說在組成sql語句的時候把引數預設為字串。
使用${}時的sql不會當做字串處理,是什麼就是什麼,如上邊的語句:select * from table1 where id=$ 在呼叫這個語句時控制台列印的為:select * from table1 where id=2 ,假設傳的引數值為2
從上邊的介紹可以看出這兩種方式的區別,我們最好是能用#{}則用它,因為它可以防止sql注入,且是預編譯的,在需要原樣輸出時才使用${},如,
select * from $ order by $ 這裡需要傳入表名和按照哪個列進行排序 ,加入傳入table1、id 則語句為:select * from table1 order by id
如果是使用#{} 則變成了select * from 'table1' order by 'id' 我們知道這樣就不對了。
另,在使用以下的配置時,必須使用#{}
select * from message where id=#;
在parametertype是int時,sql語句中必須是#{}
mybatis中 和 符號的區別
mybatis做為乙個輕量級orm框架在許多專案中使用,因其簡單的入門受到了廣大開發者的熱愛。在近期專案中再做乙個相關的開發,碰到了 符號這樣的問題,之前沒怎麼注意過,通過學習之後,有了點感悟,分享如下,使用 意味著使用的預編譯的語句,即在使用jdbc時的preparedstatement,sql語...
mybatis中 和 符號的區別
mybatis做為乙個輕量級orm框架在許多專案中使用,因其簡單的入門受到了廣大開發者的熱愛。在近期專案中再做乙個相關的開發,碰到了 符號這樣的問題,之前沒怎麼注意過,通過學習之後,有了點感悟,分享如下,使用 意味著使用的預編譯的語句,即在使用jdbc時的preparedstatement,sql語...
mybatis中 和 符號的區別
mybatis做為乙個輕量級orm框架在許多專案中使用,因其簡單的入門受到了廣大開發者的熱愛。在近期專案中再做乙個相關的開發,碰到了 符號這樣的問題,之前沒怎麼注意過,通過學習之後,有了點感悟,分享如下,使用 意味著使用的預編譯的語句,即在使用jdbc時的preparedstatement,sql語...