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

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

1 、  理論區別

         $與#的區別是很大的。#為佔位符,而$為字串拼接符。 字串拼接是將引數值以硬編碼的方式直接拼接到了SQL 語句中。字串拼接就會引發  兩個問題:SQL注入問題   與沒有使用預編譯所導致的執行效率低下問題。 佔位符的引入,解決以上兩個問題。

2、 應用場景

       一般情況下,動態引數的值是由使用者輸入的,則不能使用拼接符$,因為有可能會出現SQL注入;若動態引數的值是由系統計算生成的,則可以使用拼接符$。但這樣雖然不存在SQL 注入的風險,但仍存在執行效率問題。

3、SQL 注入

         在MyBatis 中,使用#號佔位符,則後臺執行 SQL 使用的為 PreparedStatement,將會防止 SQL注入。而使用$符,則為字串拼接,使用的為 Statement,將無法防止 SQL 注入。

 

      例如,Mapper.xml中如下的 sql 語句:

             select * from user where name = #{name};  

          動態解析為:

              select * from user where name = ?;      

         一個 #{ } 被解析為一個引數佔位符 ? 。
         而${ } 僅僅為一個純碎的 string 替換,在動態 SQL 解析階段將會進行變數替換

 

  例如,Mapper.xml中如下的 sql:

        select * from user where name = ${name};
             當我們傳遞的引數為 "Jack" 時,上述 sql 的解析為:
        select * from user where name = "Jack";           預編譯之前的 SQL 語句已經不包含變量了,完全已經是常量資料了。

    綜上所得, ${ } 變數的替換階段是在動態 SQL 解析階段,而 #{ }變數的替換是在 DBMS 中。