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


 

  • 介紹

    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

  • 概念
  1. #方式能夠很大程度防止sql注入,$方式無法防止Sql注入。
  2. $方式一般用於傳入數據庫對象,例如傳入表名。
  3. 從安全性上考慮,能使用#盡量使用#來傳參,因為這樣可以有效防止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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM