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

MyBatis MapperProvider MessageFormat 千位分隔符導致批量插入報錯

     編輯:關於SqlServer

問題現場

專案使用 MyBatis @InsertProvider 動態構建批量 INSERT,單次 500+ 筆時拋出:

org.apache.ibatis.builder.BuilderException: Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}

根因定位

MessageFormat messageFormat = new MessageFormat(
    "(#'{list[" + {0} + "].lotCode},#'{list[" + {0} + "].productVehicleCode})");

for (int i = 0; i < size; i++) {
    sb.append(messageFormat.format(new Object[]{i}));
    if (i < size - 1) sb.append(",");
}

MessageFormat.format() 對數字預設套用 Locale 格式化,**1000 會變成 "1,000"**,產生:

(#{list[1,000].lotCode},#{list[1,000].productVehicleCode})

MyBatis 解析器將逗號視為參數屬性分隔符,導致語法錯誤。

解決方案

// 方案 1:傳入字串避免數字格式化
messageFormat.format(new Object[]{String.valueOf(i)});

// 方案 2:自訂 Format 不使用分組分隔符
NumberFormat nf = NumberFormat.getIntegerInstance();
nf.setGroupingUsed(false);
MessageFormat mf = new MessageFormat("...");
mf.setFormatByArgumentIndex(0, nf);

最佳實踐建議

  • 批量 INSERT 優先使用 MyBatis 內建 foreach 標籤(XML Mapper),避免手工拼接。
  • 若必須用 Provider,參數索引一律轉字串 String.valueOf(i)。
  • 單次批量建議 500~1000 筆,超過請分批提交,防止 SQL 過長或參數超限。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved