天天看點

Mybatis動态SQL(四)-#{}和${}的差別${}參數占位符解析過程總結

#{}和${}的差別

  • `${}`參數占位符解析過程
  • 總結

${}

參數占位符解析過程

當動态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注入問題,是以可以優先考慮使用#{}占位符,當

#{}

參數占位符無法滿足需求時,才考慮使用

${}

參數占位符

繼續閱讀