MyBatis中的${}和#{}的區別
阿新 • • 發佈:2018-11-08
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 中。