Mybatis的 #{}與${}區別

在mybatis查詢時,參數傳遞方式可以是#{}或者是$ {}。
兩者的區別是:
一, #{}傳參時會將傳入參數當成是一個字符串,爲這個字符串加上引號。而$ {}則不會加引號 例:

select * from user where name = #{name}  //如果傳的name是"小明"
對應的sql執行的語句就是
select * from user where name = "小明"

select * from user where name = ${name}
對應執行
select * from user where name = 小明 //這中查詢條件對應的值就一般都會用#,不加”“的話sql無法執行
${}一般用來傳表名、字段名等數據庫對象,如:order by ${}

二 , #{}能夠很大程度防止sql注入,而${}無法防止sql注入,所以能用#{}的時候就儘量使用#{}。
爲什麼說#{}能防止sql注入:
#{}在mybatis中的底層是運用了PreparedStatement 預編譯,傳入的參數會以 ? 形式顯示,因爲sql的輸入只有在sql編譯的時候起作用,當sql預編譯完後,傳入的參數就僅僅是參數,不會參與sql語句的生成,而 $ {}則沒有使用預編譯,傳入的參數直接和sql進行拼接,由此會產生sql注入的漏洞。
$ {}沒有預編譯會造成sql注入的例子:

select * from user where name =  ${name} 

對於這樣的sql語句,如果傳參是 ** name = ‘sam or 1=1’ **
那麼使用 ${}對應生成的sql就是:

select * from user where name = sam or 1=1

這樣就會將全部數據查出來無法起到該有的作用,會帶來較大問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章