Mybaties面試中經常問到的一個問題就是#{}和${}這兩者的區別,今天我們就從源碼方面學習下:
知識儲備(我們需要有原生JDBC操作數據庫和對字符串拼接的認知)
首先我們創建一個Mapper其中一個Insert方法見圖1(樓主用的mybaties-3.4.5版本,基於註解開發),在註解Insert編寫插入sql,其中sex字段用的${},name和age用的#{}。
![mybaties源碼面試常問之#「」和$「」](http://p2.ttnews.xyz/loading.gif)
圖1
下來我們創建一個User對象,利用前面的Mapper做插入操作見圖2。
![mybaties源碼面試常問之#「」和$「」](http://p2.ttnews.xyz/loading.gif)
圖2
中間步驟略。
我們直接看相關的代碼,在mybaties的這個類中org.apache.ibatis.parsing.GenericTokenParser#parse方法完成了${sex}替換為user對象中的值見圖3,可以看到原來sql中的${sex}被替換為-男-,mybaties用字符串截取和拼接直接生成的。詳細步驟可見GenericTokenParser的parse方法。
圖3
接下來繼續,mybaties還是用同一個類GenericTokenParser做的#{name}和#{age}替換為?的工作,替換前的sql見圖4和替換完成見圖5。
圖4
圖5
最後可以看到mybaties用的原生JDBC操作完成的數據庫操作見圖6。
org.apache.ibatis.executor.statement.PreparedStatementHandler#update
圖6
總結下:${}為值替換,就是字符串拼接形式將參數拼接起來,比如要做動態查詢一個表select * from table 其中表名table不能寫固定值根據傳來的參數查詢就可以用${table}來做,而#{}是以preparedstatement預處理來執行可以防止sql注入問題,通常用#{}。
以上就是今天的分享內容,共同努力,如有錯誤還請指出。
閱讀更多 程序員yd 的文章