一個工作2年的粉絲,被問到一個Mybatis裡面的基礎問題。
他跑過來調戲我,說Mic老師,你要是能把這個問題回答到一定高度,請我和一個月奶茶。
這個問題是: ”Mybatis裡面#{}和${}的區別是什麼“
下面看看普通人和高手對這個問題的回答。
普通人:
Mybatis裡面#{}和${}的區別:
${}是一種可以動態替換的。
{}是一種佔位符。
高手:
好的,關於這個問題我從幾個方面來回答。
首先,Mybatis提供到的#號佔位符和$號佔位符,都是實現動態SQL的一種方式,通過這兩種方式把引數傳遞到XML之後,
在執行操作之前,Mybatis會對這兩種佔位符進行動態解析。
號佔位符,等同於jdbc裡面的?號佔位符。
它相當於向PreparedStatement中的預處理語句中設定引數,
而PreparedStatement中的sql語句是預編譯的,SQL語句中使用了佔位符,規定了sql語句的結構。
並且在設定引數的時候,如果有特殊字元,會自動進行轉義。
所以#號佔位符可以防止SQL隱碼攻擊。
而使用$的方式傳參,相當於直接把引數拼接到了原始的SQL裡面,Mybatis不會對它進行特殊處理。
所以$和#最大的區別在於,前者是動態引數,後者是佔位符, 動態引數無法防止SQL隱碼攻擊的問題,所以在實際應用中,應該儘可能的使用#號佔位符。
另外,$符號的動態傳參,可以適合應用在一些動態SQL場景中,比如動態傳遞表名、動態設定排序欄位等。
以上就是我對這個問題的理解。
總結
一些小的細節如果不注意,就有可能造成巨大的經濟損失。
比如現如今還是會有一些網站出現SQL隱碼攻擊導致資訊洩露的問題。
如果有任何面試問題、職業發展問題、學習問題,都可以私信我。
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!