MyBatis MapperProvider MessageFormat拼接批量SQL語句執(zhí)行報(bào)錯(cuò)的原因分析及解決辦法
最近在項(xiàng)目中有這么一段代碼:下載服務(wù)器基礎(chǔ)業(yè)務(wù)數(shù)據(jù)進(jìn)行本地批量插入操作,因項(xiàng)目中使用mybatis進(jìn)行持久化操作,故直接考慮使用mybatis的批量插入功能。
1.以下是Mapper接口的部分代碼
public interface PrintMapper { @InsertProvider(type = PrintMapperProvider.class,method = "insertAllLotWithVehicleCode4H2") void insertAllLotWithVehicleCode(List<LotWithVehicleCodeBO> lotWithVehicleCodes); }
2.對(duì)應(yīng)MapperProvider中函數(shù)片段
public String insertAllLotWithVehicleCode4H2(Map<String,List<LotWithVehicleCodeBO>> map) { List<LotWithVehicleCodeBO> lotWithVehicleCodeBOs = map.get("list"); StringBuilder sb = new StringBuilder("INSERT INTO MTC_LOT_WITH_VEHICLE_CODE (LOT_CODE,PRODUCT_VEHICLE_CODE) VALUES "); MessageFormat messageFormat = new MessageFormat("(" + "#'{'list[{0}].lotCode }," + "#'{'list[{0}].productVehicleCode }" + ")"); int size = lotWithVehicleCodeBOs.size(); for (int i = 0; i < size; i++) { sb.append(messageFormat.format(new Object[]{i})); if (i < size - 1) sb.append(","); } return sb.toString(); }
3.service層
@Transactionalpublic void synchLotWithVehicleCodeToLocalDB(List<LotWithVehicleCodeBO> lotWithVehicleCodeBOs) { if(null != lotWithVehicleCodeBOs && lotWithVehicleCodeBOs.size()>0) { printMapper.insertAllLotWithVehicleCode(lotWithVehicleCodeBOs); } }
程序上線的時(shí)候沒有發(fā)生問題,在業(yè)務(wù)量猛增的時(shí)候,大約同時(shí)執(zhí)行500條以上的時(shí)候程序就開始報(bào)錯(cuò):
Caused by: org.apache.ibatis.builder.BuilderException: Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2} at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.buildParameterMapping(SqlSourceBuilder.java:89) at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.handleToken(SqlSourceBuilder.java:43) at org.apache.ibatis.parsing.GenericTokenParser.parse(GenericTokenParser.java:25) at org.apache.ibatis.builder.SqlSourceBuilder.parse(SqlSourceBuilder.java:24) at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:57) ... 61 more
異常已指明SQL語句構(gòu)建問題,DEBUG進(jìn)去:
問題根源:
MessageFormat messageFormat = new MessageFormat("(" + "#'{'list[{0}].lotCode }," + "#'{'list[{0}].productVehicleCode }," + ")"); int size = lotWithVehicleCodeBOs.size(); for (int i = 0; i < size; i++) { sb.append(messageFormat.format(new Object[]{i})); if (i<size-1) sb.append(","); }
當(dāng)size達(dá)到3位數(shù)以上時(shí)構(gòu)建出的message為:
(#{list[1,000].lotCode },#{list[1,000].productVehicleCode })
解決辦法:messageFormat.format(new Object[]{i+""}
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。