一個作業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帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491297.html
標籤:Java
