激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

香港云服务器
服務(wù)器之家 - 數(shù)據(jù)庫 - Sql Server - MyBatis MapperProvider MessageFormat拼接批量SQL語句執(zhí)行報錯的原因分析及解決辦法

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

2020-04-30 14:42MSSQL教程網(wǎng) Sql Server

這篇文章主要介紹了MyBatis MapperProvider MessageFormat拼接批量SQL語句執(zhí)行報錯的原因分析及解決辦法的相關(guān)資料,需要的朋友可以參考下

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

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

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

2.對應(yīng)MapperProvider中函數(shù)片段

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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層

?
1
2
3
4
5
6
@Transactionalpublic void synchLotWithVehicleCodeToLocalDB(List<LotWithVehicleCodeBO> lotWithVehicleCodeBOs)
{ if(null != lotWithVehicleCodeBOs && lotWithVehicleCodeBOs.size()>0)
{
printMapper.insertAllLotWithVehicleCode(lotWithVehicleCodeBOs);
}
}

程序上線的時候沒有發(fā)生問題,在業(yè)務(wù)量猛增的時候,大約同時執(zhí)行500條以上的時候程序就開始報錯:

?
1
2
3
4
5
6
7
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進去:

問題根源:

?
1
2
3
4
5
6
7
8
9
10
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達到3位數(shù)以上時構(gòu)建出的message為:

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

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

延伸 · 閱讀

精彩推薦
451
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 被啪羞羞视频在线观看 | 九九黄色 | 国产亚洲黑人性受xxxx精品 | 激情97 | 蜜桃免费在线 | 久久精品视频16 | 一级国产免费 | 91久久国产 | 毛片av网址 | 亚洲国产精品一区二区精品 | 狠狠操视频网站 | 国产精品爱久久久久久久 | 国产一区免费在线 | 免费一级欧美在线观看视频 | 在火车上摸两乳爽的大叫 | 午夜视频中文字幕 | 精品国产一区二区亚洲人成毛片 | 黄色一级片免费观看 | teensexhd| 日日操视频 | 小雪奶水翁胀公吸小说最新章节 | 欧美日韩中文字幕在线 | 法国极品成人h版 | 动漫孕妇被羞羞视频 | 最近日本电影hd免费观看 | 福利国产视频 | 久久国产精品久久精品国产演员表 | 成人性生活视频在线观看 | 免费毛片在线视频 | 成人黄色一级电影 | 一二区电影 | 精品成人一区 | 成人免费淫片 | 亚洲一区二区三区在线免费观看 | 国产一区二区三区视频在线观看 | 巨乳激情 | 色婷婷久久久亚洲一区二区三区 | 精品在线视频播放 | cosplay裸体福利写真 | 国产成人精品一区二区仙踪林 | 免费的毛片 |