mybaties源碼面試常問之#「」和$「」

Mybaties面試中經常問到的一個問題就是#{}和${}這兩者的區別,今天我們就從源碼方面學習下:

知識儲備(我們需要有原生JDBC操作數據庫和對字符串拼接的認知)

首先我們創建一個Mapper其中一個Insert方法見圖1(樓主用的mybaties-3.4.5版本,基於註解開發),在註解Insert編寫插入sql,其中sex字段用的${},name和age用的#{}。


mybaties源碼面試常問之#「」和$「」

圖1

下來我們創建一個User對象,利用前面的Mapper做插入操作見圖2。

mybaties源碼面試常問之#「」和$「」

圖2

中間步驟略。

我們直接看相關的代碼,在mybaties的這個類中org.apache.ibatis.parsing.GenericTokenParser#parse方法完成了${sex}替換為user對象中的值見圖3,可以看到原來sql中的${sex}被替換為-男-,mybaties用字符串截取和拼接直接生成的。詳細步驟可見GenericTokenParser的parse方法。

mybaties源碼面試常問之#「」和$「」

圖3

接下來繼續,mybaties還是用同一個類GenericTokenParser做的#{name}和#{age}替換為?的工作,替換前的sql見圖4和替換完成見圖5。

mybaties源碼面試常問之#「」和$「」

圖4

mybaties源碼面試常問之#「」和$「」

圖5

最後可以看到mybaties用的原生JDBC操作完成的數據庫操作見圖6。

org.apache.ibatis.executor.statement.PreparedStatementHandler#update

mybaties源碼面試常問之#「」和$「」

圖6

總結下:${}為值替換,就是字符串拼接形式將參數拼接起來,比如要做動態查詢一個表select * from table 其中表名table不能寫固定值根據傳來的參數查詢就可以用${table}來做,而#{}是以preparedstatement預處理來執行可以防止sql注入問題,通常用#{}。

以上就是今天的分享內容,共同努力,如有錯誤還請指出。


分享到:


相關文章: