【Mybatis】佔位符#{}和${}的區別

  #{}是佔位符,${}是拼接符。

  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 111, 如果傳入的值是id,則解析成的sql爲order by id.
  3. #{}方式能夠很大程度防止sql注入,${}方式無法防止Sql注入。
  4. ${}方式一般用於傳入數據庫對象,例如傳入表名。
  5. 能用#{}的就別用${}。MyBatis使用order by 動態參數進行排序時需要注意,用 ${}而不是#{}。
  6. 對於拼接符${},如果僅傳入一個類型爲String的參數(注意是隻有一個參數),那麼在 ${}中參數名稱必須使用value或_parameter來代替。例如:
<select id="findByName" parameterType="java.lang.String" resultType="main.com.em.domain.Room">
        SELECT * FROM room
        <where>
            <!--對於拼接符${},如果僅傳入一個類型爲String的參數(注意是隻有一個參數),那麼在${}中參數名稱必須使用value或_parameter來代替-->
            <if test="value!=null and value!=''">
                AND name LIKE '%${value}%'
            </if>
        </where>
 </select>

PS:在使用mybatis中還遇到<![CDATA[]]>的用法,在該符號內的語句,將不會被當成字符串來處理,而是直接當成sql語句,比如要執行一個存儲過程。

總結

  1. #{}是預編譯處理,${}是字符串替換。
  2. Mybatis 在處理#{}時,會將 sql 中的#{}替換爲?號,調用 PreparedStatement 的set 方法來賦值。
  3. Mybatis 在處理$ {}時,就是把${}替換成變量的值。
  4. 使用#{}可以有效的防止 SQL 注入,提高系統安全性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章