#{}和${}的差別
- `${}`參數占位符解析過程
- 總結
${}
參數占位符解析過程
${}
當動态SQL配置中存在
${}
參數占位符時,MyBatis會使用TextSqlNode對象描述對應的SQL節點,在調用TextSqlNode對象的apply()方法時會完成動态SQL的解析
也就是說,
${}
參數占位符的解析是在TextSqlNode類的apply()方法中完成的
在TextSqlNode類的apply()方法中,首先調用createParser()方法 建立一個 GenericTokenParser對象
通過 GenericTokenParser對象 解析
${}
參數占位符,然後通過 BindingTokenParser對象 處理 參數占位符的内容
createParser()方法傳回一個 GenericTokenParser對象,指定 openToken屬性為
${
,closeToken屬性為
}
,TokenHandler(入參)為BindingTokenParser對象
GenericTokenParser對象的parse方法 周遊擷取所有
${}
參數占位符的内容,然後調用 BindingTokenParser對象的handleToken()方法 對 參數占位符内容 進行替換
在BindingTokenParser類的handleToken()方法中,根據參數占位符名稱擷取對應的參數值,然後替換為對應的參數值
總結
使用
#{}
參數占位符時,占位符内容會被替換成
?
,然後通過PreparedStatement對象的setXXX()方法為參數占位符設定值
${}
參數占位符内容會被直接替換為參數值
使用
#{}
參數占位符能夠有效避免SQL注入問題,是以可以優先考慮使用#{}占位符,當
#{}
參數占位符無法滿足需求時,才考慮使用
${}
參數占位符