这篇文章主要讲解了“MyBatis拼接批量SQL语句执行报错怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MyBatis拼接批量SQL语句执行报错怎么解决”吧!

下载服务器基础业务数据进行本地批量插入操作,因项目中使用mybatis进行持久化操作,故直接考虑使用mybatis的批量插入功能。

1.以下是Mapper接口的部分代码

publicinterfacePrintMapper{@InsertProvider(type=PrintMapperProvider.class,method="insertAllLotWithVehicleCode4H2")voidinsertAllLotWithVehicleCode(List<LotWithVehicleCodeBO>lotWithVehicleCodes);}

2.对应MapperProvider中函数片段

publicStringinsertAllLotWithVehicleCode4H2(Map<String,List<LotWithVehicleCodeBO>>map){List<LotWithVehicleCodeBO>lotWithVehicleCodeBOs=map.get("list");StringBuildersb=newStringBuilder("INSERTINTOMTC_LOT_WITH_VEHICLE_CODE(LOT_CODE,PRODUCT_VEHICLE_CODE)VALUES");MessageFormatmessageFormat=newMessageFormat("("+"#'{'list[{0}].lotCode},"+"#'{'list[{0}].productVehicleCode}"+")");intsize=lotWithVehicleCodeBOs.size();for(inti=0;i<size;i++){sb.append(messageFormat.format(newObject[]{i}));if(i<size-1)sb.append(",");}returnsb.toString();}

3.service层

@TransactionalpublicvoidsynchLotWithVehicleCodeToLocalDB(List<LotWithVehicleCodeBO>lotWithVehicleCodeBOs){if(null!=lotWithVehicleCodeBOs&&lotWithVehicleCodeBOs.size()>0){printMapper.insertAllLotWithVehicleCode(lotWithVehicleCodeBOs);}}

程序上线的时候没有发生问题,在业务量猛增的时候,大约同时执行500条以上的时候程序就开始报错:

Causedby:org.apache.ibatis.builder.BuilderException:Improperinlineparametermapformat.Shouldbe:#{propName,attr1=val1,attr2=val2}atorg.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.buildParameterMapping(SqlSourceBuilder.java:89)atorg.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.handleToken(SqlSourceBuilder.java:43)atorg.apache.ibatis.parsing.GenericTokenParser.parse(GenericTokenParser.java:25)atorg.apache.ibatis.builder.SqlSourceBuilder.parse(SqlSourceBuilder.java:24)atorg.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:57)...61more

异常已指明SQL语句构建问题,DEBUG进去:

问题根源:

MessageFormatmessageFormat=newMessageFormat("("+"#'{'list[{0}].lotCode},"+"#'{'list[{0}].productVehicleCode},"+")");intsize=lotWithVehicleCodeBOs.size();for(inti=0;i<size;i++){  sb.append(messageFormat.format(newObject[]{i}));  if(i<size-1)sb.append(",");}

当size达到3位数以上时构建出的message为:

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

解决办法:messageFormat.format(new Object[]{i+""}

感谢各位的阅读,以上就是“MyBatis拼接批量SQL语句执行报错怎么解决”的内容了,经过本文的学习后,相信大家对MyBatis拼接批量SQL语句执行报错怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!