【Java面試】Mybatis中#{}和${}的區別是什麼?

跟著Mic學架構 發表於 2022-06-18
Java 面試 MyBatis

一個工作2年的粉絲,被問到一個Mybatis裡面的基礎問題。

他跑過來調戲我,說Mic老師,你要是能把這個問題回答到一定高度,請我和一個月奶茶。

這個問題是: ”Mybatis裡面#{}和${}的區別是什麼“

下面看看普通人和高手對這個問題的回答。

普通人:

Mybatis裡面#{}和${}的區別:

${}是一種可以動態替換的。

{}是一種佔位符。

高手:

好的,關於這個問題我從幾個方面來回答。

首先,Mybatis提供到的#號佔位符和$號佔位符,都是實現動態SQL的一種方式,通過這兩種方式把引數傳遞到XML之後,

在執行操作之前,Mybatis會對這兩種佔位符進行動態解析。

號佔位符,等同於jdbc裡面的?號佔位符。

它相當於向PreparedStatement中的預處理語句中設定引數,

而PreparedStatement中的sql語句是預編譯的,SQL語句中使用了佔位符,規定了sql語句的結構。

並且在設定引數的時候,如果有特殊字元,會自動進行轉義。

所以#號佔位符可以防止SQL隱碼攻擊。

carbon-202204221206001

而使用$的方式傳參,相當於直接把引數拼接到了原始的SQL裡面,Mybatis不會對它進行特殊處理。

carbon-202204221206002

所以$和#最大的區別在於,前者是動態引數,後者是佔位符, 動態引數無法防止SQL隱碼攻擊的問題,所以在實際應用中,應該儘可能的使用#號佔位符。

另外,$符號的動態傳參,可以適合應用在一些動態SQL場景中,比如動態傳遞表名、動態設定排序欄位等。

以上就是我對這個問題的理解。

總結

一些小的細節如果不注意,就有可能造成巨大的經濟損失。

比如現如今還是會有一些網站出現SQL隱碼攻擊導致資訊洩露的問題。

如果有任何面試問題、職業發展問題、學習問題,都可以私信我。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!