mybatis面試點|#和$的區別
- 2019 年 10 月 7 日
- 筆記
小刀部落格: https://www.lixiang.red 小刀公眾號: 程式設計師學習大本營
問題詳情
在我們拼接mysql的語句時, 通常會有大佬提醒我們,要注意 #和$符號的使用: id = #{id} , id = ${id} , 那這兩種寫法有什麼區別呢?
問題解答
用#號的號,可以用使用PreparedStatement+佔位符的方式來拼sql語句,可以防止sql注入,更安全
問題解析
對#號的處理
源碼中,對#{}的特殊處理可以在這個位置看到

然後我們斷點打開解析器裡面,可以看到在解析完之後,就從#{id} 變成了 ?

在換成?的同時,把id包裝成parameterMapping並添加到parameterMappings中,後面還要獲取出來,然後拿值,再把值放到prepareStatement中

一步步debug下來,我們經過了 Executor(執行器) , 然後到TypeHandler, 找到對應的參數處理器,然後執行 ps.setInt('位置','值'). 完成了整個過程

對$號的處理
這個就很簡單了 在調用SqlSource.getBoundSql() 去獲取要執行sql的時候,就會被token解析器給換成值了.

思考題
在上述debug的過種中,我們可以看到,mybatis對動態sql和靜態sql的處理是不一樣的. 那什麼樣的sql是動態sql呢?
select * from t where t=#{id} , select * from t where t=${id}
哪一個是動態sql? 歡迎留言和小刀一起討論學習