專案使用 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);
foreach 標籤(XML Mapper),避免手工拼接。String.valueOf(i)。