首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis 中 #{ } 與 ${ } 差異深度解析

     編輯:Java 相關知識

前言

在 MyBatis 映射文件中,#{ } 和 ${ } 是兩種常見的參數佔位符,但它們的行為截然不同。正確理解二者區別,對於防止 SQL 注入、動態構建查詢至關重要。

核心差異對比

特性#{ }${ }
參數處理方式預編譯參數(PreparedStatement),自動加引號直接字符串替換,不加引號
SQL 注入防護有效防禦無防禦,極易注入
適用場景值參數(WHERE 條件、INSERT 值等)數據庫對象名(表名、列名、ORDER BY 列)
性能可複用執行計劃,較快每次重新解析,較慢

具體示例

使用 #{ }

SELECT * FROM user WHERE id = #{userId}

若傳入 111,生成 SQL:SELECT * FROM user WHERE id = ?,參數綁定為 111。

使用 ${ }

ORDER BY ${columnName}

若傳入 create_time,生成 SQL:ORDER BY create_time,無參數綁定。

官方文檔說明

默認使用 #{ } 會生成 PreparedStatement 參數佔位符(?),安全、快捷且為首選。只有當需要動態指定表名、列名或排序字段時,才應謹慎使用 ${ },並務必自行驗證輸入,防止 SQL 注入。

最佳實踐建議

  1. 優先使用 #{ } 處理所有業務數據參數。
  2. 僅在動態表名、列名、排序字段等無法使用預編譯的場景下使用 ${ }。
  3. 使用 ${ } 時,必須在應用層對輸入進行嚴格白名單校驗。
  4. 避免在 ${ } 中直接拼接用戶未經過濾的輸入。

總結

#{ } 是安全的參數綁定機制,${ } 是不安全的字符串模板替換。掌握二者邊界,是編寫健壯 MyBatis 映射的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved