MyBatis中#{}和${}的四個區別
阿新 • • 發佈:2018-11-03
區別1:
#{} 相當於JDBC SQL語句中的佔位符 “?”(PreparedStatement)
${} 相當於JDBC SQL語句中的連線符號 “+” (Statement)
所以,${} 存在SQL注入問題
區別2:
#{} 進行輸入對映的時候,會對引數進行型別解析(如果是String型別,會自動加上引號)
${} 進行輸入對映的時候,將引數原樣輸出到SQL語句中
所以在like條件查詢中要小心
例如:
當查詢條件中的name=”崑山花臂男”時
使用#{}
select * from user where username like '%#{name}%'
會得到如下的sql:
select * from user where username like '%'崑山花臂男'%'
這個sql會執行報錯。
而使用${}時
select * from user where username like '%${name}%'
會得到如下的sql:
select * from user where username like '%崑山花臂男%'
該sql可以正常執行。
區別3:
#{} 如果進行簡單型別(String,Date、8種基本型別的包裝類)的輸入對映時,#{}中引數名稱可以任意
#{} 如果進行簡單型別(String,Date、8種基本型別的包裝類)的輸入對映時,${}中引數名稱必須是value
區別4:
#{}是通過反射取引數資料 (StaticSqlSource)
${}是通過OGNL表示式取引數資料 (DynamicSqlSource)