1. 程式人生 > >MyBatis中#{}和${}的四個區別

MyBatis中#{}和${}的四個區別

區別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)