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

MyBatis 多參數傳遞錯誤:XML 中無法綁定多個 String 參數的解決方案

     編輯:程式設計疑難解答

問題現象

Mapper 介面方法定義多個 `String` 參數:

List<Record> selectByTimeRange(String time1, String time2);

XML 中直接用 `#{time1}`、`#{time2}` 報錯:「找不到該字段/參數」。

根本原因

MyBatis 不支援直接綁定多個散裝基本類型/String 參數。單參數時自動包裝;多參數時需顯式指定參數名稱或封裝對象。

三種解決方案

方案一:@Param 註解(最簡單,推薦)

// Mapper 介面
List<Record> selectByTimeRange(@Param("start") String time1, @Param("end") String time2);

// XML
SELECT * FROM record_table
WHERE reg_date BETWEEN #{start} AND #{end}

方案二:封裝為 POJO/Map(結構化、擴展性強)

// 參數對象
public class TimeRangeParam {
    private String startTime;
    private String endTime;
    // getter/setter
}

// Mapper
List<Record> selectByTimeRange(TimeRangeParam param);

// XML
SELECT * FROM record_table
WHERE reg_date BETWEEN #{startTime} AND #{endTime}

或直接用 `Map`:

Map params = new HashMap<>();
params.put("start", time1);
params.put("end", time2);
mapper.selectByTimeRange(params);

方案三:註解式 SQL(無 XML,適合簡單查詢)

@Select("SELECT * FROM record_table WHERE reg_date BETWEEN #{start} AND #{end}")
List<Record> selectByTimeRange(@Param("start") String time1, @Param("end") String time2);

最佳實務建議

  • 參數 ≤ 2 且類型簡單:用 @Param,輕量直觀。
  • 參數 > 2 或邏輯相關:封裝 Param Object,語義清晰、易擴展、利於單元測試。
  • 動態條件構建:配合 ``、``、`` 靈活組裝 SQL。
  • 避免在 XML 中使用 `#{param1}`、`#{param2}` 等預設名稱(MyBatis 3.4+ 預設 `param1`、`param2`...),可讀性差且易出錯。

總結

MyBatis 多參數綁定的核心規則:單參數自動包裝,多參數必須顯式命名(@Param)或封裝對象。養成「參數對象化」習慣,能避免 90% 的參數綁定錯誤,並提升代碼可維護性。

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