Mybatis中${param}與#{param}的區別說明

${param}與#{param}的區別

${param}表達式主要用戶獲取配置文件數據,DAO接口中的參數信息,當 $ 出現在映射文件的 SQl 語句中時創建的不是預編譯的 SQL ,而是字符串的拼接有可能會導致 SQL 註入的問題,所以一般使用 $ 接收 DAO 參數時,這些參數一般是字段名,表名等.例如 order by {column}

#{param} 表達式主要是用戶獲取 DAO 中的參數數據,在映射文件的SQL 語句中出現 #{} 表達式,底層會創建預編譯的 SQL .性能會相對較好

${} 獲取 DAO 參數數據時,參數必須使用 @param 註解進行修飾

#{} 獲取 DAO 參數數據時,假如參數個數多於一個,可有選擇的使用@param

Mybatis中#{}與${}使用總結

#{ }與${ }的區別

1、#{ }將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。 如:

delete from user where name= #{name}

實際相當於一個占位符:

delete from user where name= ?

如果傳入的值是123,那麼解析成sql時的值為 delete from user where name= 123, 如果傳入的值是字符串 Rose,則解析成的sql為delete from user where name= 'Rose'

2、${ }將傳入的數據直接顯示生成在sql中,即原樣拼接。對於

delete from user where name= ${name}

如果傳入的值int類型的123,那麼解析成sql時的值為

delete from user where name= 123

如果傳入的值是字符串Rose,則解析成的sql為

delete from user where name= Rose

這樣就是錯誤的,必須將原來的語句改為

delete from user where name= '${name}'

3、#方式能夠防止sql註入;$方式無法防止Sql註入

$方式一般用於傳入數據庫對象,例如傳入表名

默認情況下,使用#{}格式的語法會導致MyBatis創建預處理語句屬性並以它為背景設置安全的值。這樣做很安全,很迅速也是首選做法,有時隻是想直接在SQL語句中插入一個不改變的字符串,可以使用${ }。

使用總結

1、#{ }:多用於傳遞查詢的參數;一般用在用戶輸入值的地方,在sql中:字段 比較符號(=、>、<、!=、<>) #{用戶輸入的值};

  • 如果傳遞參數是基本類型(非字符類型),獲取參數是原樣獲取, 如果是字符串,#{}獲取時會自動給加一個引號。
  • 對於基本類型和String類型可以在#{ }內任意填寫,一半填寫對應值。

2、${ }:一般用於傳入數據庫對象,例如傳入表名,如:$(表名);一般用於order by的後面,如:order by $(字段);表名作為變量時,必須使用 ${ };用在我們能夠確定值的地方,也就是我們程序員自己賦值的地方;

  • 如果傳遞是基本類型的闡述,int,String等等。${}隻能寫value,如${value}

3、如果傳遞參數是對象:#{}和${}都是ognl表達式來獲取 (對象導航語言 屬性.屬性.屬性)

  • 如:
<update id="updateUserByID" parameterType="domain.User">
 update user set username=#{username},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
  • #{}內的內容必須是User對應的屬性值。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: