在下面的語句中,如果 username 的值為 zhangsan,則兩種方式無任何區別:
select * from user where name = #;
select * from user where name = $;
其解析之後的結果均為
select * from user where name = 'zhangsan';
但是 #{} 和 ${} 在預編譯中的處理是不一樣的。#{} 在預處理時,會把引數部分用乙個佔位符 ? 代替,變成如下的 sql 語句:
select * from user where name = ?;
而 ${} 則只是簡單的字串替換,在動態解析階段,該 sql 語句會被解析成
select * from user where name = 'zhangsan';
以上,#{} 的引數替換是發生在 dbms 中,而 ${} 則發生在動態解析過程中。
那麼,在使用過程中我們應該使用哪種方式呢?
答案是,優先使用 #{}。因為 ${} 會導致 sql 注入的問題。看下面的例子:
select * from $ where name = #
在這個例子中,如果表名為
user; delete user; --
則動態解析之後 sql 如下:
select * from user; delete user; -- where name = ?;
--之後的語句被注釋掉,而原本查詢使用者的語句變成了查詢所有使用者資訊+刪除使用者表的語句,會對資料庫造成重大損傷,極大可能導致伺服器宕機。
但是表名用引數傳遞進來的時候,只能使用 ${} ,具體原因可以自己做個猜測,去驗證。這也提醒我們在這種用法中要小心sql注入的問題。
優先使用 #{}。因為 ${} 會導致 sql 注入的問題。
與 的區別詳解
表示乙個佔位符,接受輸入引數,型別可以為簡單型別 pojo hashmap。如果接受簡單型別,中可以寫成value或其他名稱。接受pojo物件值,通過ognl讀取物件中的屬性值,通過屬性.屬性.屬性.的方式獲取隊形屬性值。表示乙個拼接符,會引起sql注入,所以不建議使用 接收輸入引數,型別可以為簡單...
var let const詳解與區別
二 let 三 const 總結在函式內宣告視為區域性變數,當函式結束時,該變數就被銷毀 function testvar testvar console.log i 報錯 script 在函式外宣告或直接省略 var 不推薦 則視為全域性變數 var y 10 推薦 function testva...
Session與Cookie的區別詳解
一.概念理解 你可能有留意到當你瀏覽網頁時,會有一些推送訊息,大多數是你最近留意過的同類東西,比如你想買桌子,上 搜了一下,結果連著幾天會有各種各樣的桌子的鏈結。這是因為 你瀏覽某個網頁的時候,web 伺服器會先送一些資料放在你的計算機上,類似於你打的文字,選的一些東西什麼的,cookie 會幫你都...