国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

MyBatis MapperProvider MessageFormat拼接批量SQL語句執行報錯的原因分析及解決辦法

2020-07-25 12:47:45
字體:
來源:轉載
供稿:網友

最近在項目中有這么一段代碼:下載服務器基礎業務數據進行本地批量插入操作,因項目中使用mybatis進行持久化操作,故直接考慮使用mybatis的批量插入功能。

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

public interface PrintMapper{@InsertProvider(type = PrintMapperProvider.class,method = "insertAllLotWithVehicleCode4H2") void insertAllLotWithVehicleCode(List<LotWithVehicleCodeBO> lotWithVehicleCodes);}

2.對應MapperProvider中函數片段

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);}}

程序上線的時候沒有發生問題,在業務量猛增的時候,大約同時執行500條以上的時候程序就開始報錯:

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語句構建問題,DEBUG進去:

問題根源:

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(",");}

當size達到3位數以上時構建出的message為:

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清远市| 余江县| 通榆县| 呼和浩特市| 休宁县| 大洼县| 井陉县| 德州市| 平塘县| 锡林郭勒盟| 扶绥县| 韩城市| 株洲市| 潜山县| 福安市| 宁都县| 来安县| 旬阳县| 句容市| 临湘市| 普陀区| 明星| 库尔勒市| 怀远县| 贵德县| 泽州县| 和政县| 达日县| 惠水县| 郸城县| 新建县| 邮箱| 敦煌市| 伊通| 山阳县| 黄石市| 水富县| 道孚县| 陇南市| 恩施市| 株洲县|