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? 歡迎留言和小刀一起討論學習