首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MyBatis Map 參數傳遞機制:parameterType 與 #{key} 的映射關系

     編輯:程式設計疑難解答

問題核心

Mapper 接口方法接收 Map 參數,XML 中 parameterType="map",SQL 里用 #{account},這個 account 值從哪來?

機制解析

// 接口
int countUser(Map params);

// 調用
Map map = new HashMap<>();
map.put("account", "user123");
map.put("status", 1);
mapper.countUser(map);

映射規則

  1. parameterType="map":告訴 MyBatis 參數是 Map 類型
  2. #{key}:從 Map 中根據 key 取值,等同于 map.get("key")
  3. key 必須存在:Map 中必須包含該 key,否則報錯或為 null

XML 配置示例

<select id="countUser" resultType="int" parameterType="map">
    SELECT COUNT(*) FROM users 
    WHERE account = #{account} 
    AND status = #{status}
</select>

常見錯誤與解決

錯誤現象原因解決
BindingException: Parameter 'account' not foundMap 中無 "account" key調用方 put 正確 key
SQL 執行結果為 0key 拼寫不一致 (account vs acount)檢查 key 拼寫大小寫
類型轉換異常Map value 類型與數據庫列類型不匹配確保 put 正確類型值

進階用法:@Param 註解替代 Map

// 接口
int countUser(@Param("account") String account, @Param("status") Integer status);

// XML 中直接用 #{account}, #{status}
// 無需 Map 包裝,代碼更清晰

多參數傳遞最佳實踐

  1. ≤2 參數:用 @Param 註解,直觀清晰
  2. >2 參數或動態參數:用 Map 或 POJO 封裝
  3. POJO 方式:定義參數類,parameterType="com.xxx.ParamDTO",SQL 里 #{fieldName}
  4. 混合場景:@Param 註解 POJO 對象 @Param("param") UserQueryDTO dto

總結

#{account} 的值來自調用方傳入 Map 中 put 的 "account" 鍵值。MyBatis 以 Map 作為參數上下文,OGNL 表達式解析 #{key} 時調用 map.get("key")。確保調用方、XML、SQL 三處 key 名稱完全一致是關鍵。

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