国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - MyBatis MapperProvider MessageFormat拼接批量SQL語句執行報錯的原因分析及解決辦法

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

2020-04-30 14:42MSSQL教程網 Sql Server

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

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

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

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

2.對應MapperProvider中函數片段

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

程序上線的時候沒有發生問題,在業務量猛增的時候,大約同時執行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語句構建問題,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(",");
}

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 在线视频中文字幕 | 狠狠操夜夜操 | 欧美精品一二三区 | 久久久亚洲国产美女国产盗摄 | 亚洲精品日本 | 国产成人毛片 | 亚洲va欧美va人人爽成人影院 | 国产成人精品一区二区三区视频 | 亚洲久久久久 | 北条麻妃99精品青青久久主播 | 日韩成人在线一区二区 | 黄色永久网站 | 欧美日韩国产综合视频 | 久久久www成人免费无遮挡大片 | 在线成人免费电影 | 精品久久久久久久久久久久久久 | 91精品国产日韩91久久久久久 | 亚洲精品电影网在线观看 | 欧美日韩第一页 | 午夜看片 | 日韩性精品 | 欧美操穴 | 在线看av的网址 | 日韩精品99 | 久久久大 | 日本福利片 | 91精品国产亚洲 | 国产毛片av| 不用播放器的av | 久久国产午夜 | 亚洲精品一区二区三区在线 | 成人免费毛片高清视频 | 激情综合色综合久久综合 | 久久精品一级毛片 | 懂色aⅴ精品一区二区三区蜜月 | 91精品久久久久久综合五月天 | 一级免费片 | 欧美日韩精品在线 | av免费一区二区 | 一区二区三区免费 | 午夜影院在线 |