- 介紹
MyBatis中使用parameterType向SQL語句傳參,parameterType后的類型可以是基本類型int,String,HashMap和java自定義類型。
在SQL中引用這些參數的時候,可以使用兩種方式#{parameterName}或者${parameterName}。
- #{}
#將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。
例如:order by #{parameterName} //或取Map中的value#{Key}也是一樣操作。
假設傳入參數是“Smith”
會解析成:order by "Smith"
- ${}
$將傳入的數據直接顯示生成在sql中。
例如:order by #{parameterName} //或取Map中的value#{Key}也是一樣操作。
假設傳入參數是“Smith”
會解析成:order by Smith
- 概念
- #方式能夠很大程度防止sql注入,$方式無法防止Sql注入。
- $方式一般用於傳入數據庫對象,例如傳入表名。
- 從安全性上考慮,能使用#盡量使用#來傳參,因為這樣可以有效防止SQL注入的問題。
- 重點
MyBatis排序時使用order by 動態參數時需要注意,用$而不是#!
例如:ORDER BY ${columnName} //這里MyBatis不會修改或轉義字符串,可實現動態傳入排序。
建議:接受從用戶輸出的內容並提供給語句中不變的字符串,這樣做是不安全的。
這會導致潛在的SQL注入攻擊,因此你不應該允許用戶輸入這些字段,或者通常自行轉義並檢查。
附加:Map傳入判斷條件進行動態排序
<!-- 假設: Map<String,Object> map=new HashMap<String,Object>(); map.put("turn","c.ordinaryPrice"); //以商品的普通價格排序 --> <select id="" parameterType="Map" resultType="com.entity.Commodity" > SELECT * FROM commodity c where 1=1 <!-- _parameter.containsKey('鍵') 作用:判斷鍵是否存在返回值boolean #{鍵}取對應的值 !必須三處鍵值對應,否則取不到值--> <if test="_parameter.containsKey('varietyID')"> ORDER BY ${turn} </if> </select>