1. 程式人生 > >Mybatis 中在傳參時,$ 和# 的區別

Mybatis 中在傳參時,$ 和# 的區別

MyBatis中使用parameterType向SQL語句傳參,parameterType後的型別可以是基本型別int,String,HashMap和java自定義型別。

在SQL中引用這些引數的時候,可以使用兩種方式#{parameterName}或者${parameterName},

   首先,我們說一下這兩種引用引數時的區別,使用#{parameterName}引用引數的時候,Mybatis會把這個引數認為是一個字串,例如傳入引數是“Smith”,那麼在SQL(Select * from emp where name = #{employeeName})使用的時候就會轉換為Select * from emp where name = 'Smith';同時在SQL(Select * from emp where name = ${employeeName}

)使用的時候就會轉換為Select * from emp where name = Smith。

   再次,從安全性上考慮,能使用#儘量使用#來傳參,因為這樣可以有效防止SQL注入的問題。

最後總結一下必須使用$引用引數的情況,我能想到的目前只有一種,那就是引數的int型的時候,必須使用$引用。

如果你想要直接拼好的sql  mybatis 裡 你加入引數用 ${param_name}  而不是用 #{param_name}  $ 會在你呼叫sql前進行處理 # 會通過引數注入處理。


 但用$不好的地方就是 $ 解析完後直接就是字串的sql 我的DATE  型別不能被傳入,傳入會轉為字串  , 即使字串型別 也要加上'' 
example : where name = '${name}' , where name = #{name} 這就是區別。

簡單來說#{} 解析的是佔位符?可以防止SQL注入, 比如打印出來的語句 select * from table where id=?然而
${} 則是不能防止SQL注入打印出來的語句 select * from table where id=2  實實在在的引數

1. #將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麼解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id".

2. $將傳入的資料直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那麼解析成sql時的值為order by user_id,  如果傳入的值是id,則解析成的sql為order by id.



3. #方式能夠很大程度防止sql注入。

4.$方式無法防止Sql注入。

5.$方式一般用於傳入資料庫物件,例如傳入表名.

6.一般能用#的就別用$.MyBatis排序時使用order by 動態引數時需要注意,用$而不是#