1. 程式人生 > >mybatis中#{}和${}的區別

mybatis中#{}和${}的區別

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中#{}和${}的區別