mybatis中#{}和${}的區別
阿新 • • 發佈:2018-08-09
myba 執行 支持 原生 漏洞 其實在 use 因此 from
動態sql是mybatis的主要特性之一,我們的慣用做法是將mapper中收集來的參數傳遞到xml中,組裝成動態的sql語句
去執行,mybatis支持兩種參數替換的語法:${}和#{},下面簡單介紹下兩者的區別
1、在解析時:
${}是一個簡單的String替換
#{}會解析為一個prepared statement,對的,學習過原生jdbc的同學一定再熟悉不過這個叫法了:預處理語句
也就是類似select * from user where name = ?; 預處理的好處?寫過視圖的應該知道,視圖就好比一條預處理的sql
執行的時候效率當然更高一些
2、防sql註入
${}既然是String原原本本的替換,那麽如果我找漏洞,可否將傳入的值後面加一個類似於可執行的sql語句?
比如傳入id值,我可以這樣傳入:"id=1;delete from user",最後拼接起來的語句變為
"select * from user where id=1;delete from user"
user表被刪了,當然這是個簡單的例子,僅僅用來說明問題
#{}則不會出現這樣的問題
因此在傳入的值中包含表名的時候,必須使用#{},其實在項目中${}早已被丟棄、、、
mybatis中#{}和${}的區別