问题描述
问题:
之前为解决Spring data jpa 批量插入/删除(saveAll()/deleteAll())速度慢的问题
重写了saveAll()方法,用自定义拼接sql的方法组装sql,但是会出现不兼容特殊符号的问题,于是采用预处理的对占位符进行赋值。
解决方案:
使用 query.setParameter()对占位符进行赋值处理。
@Override
public List<OutChannelPlaybill> batchInsertPre(List<OutChannelPlaybill> outChannelPlaybills) {
Long beginTime = System.currentTimeMillis(); // 开始时间
StringBuilder sb = into();
int i = 0;
int size;
if (outChannelPlaybills.size() < 1000) {
size = outChannelPlaybills.size() * 13;
} else {
size = 1000 * 13;
}
List<Object> paramList = new ArrayList<>(size);
for (OutChannelPlaybill dis : outChannelPlaybills) {
i++;
if (i > 1) {
sb.append(",");
}
sb.append(" (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ");
paramList.add(dis.getOutChannelId());
paramList.add(dis.getDuration());
paramList.add(dis.getName());
paramList.add(dis.getSynchro());
paramList.add(dis.getType());
paramList.add(dis.getStartTime());
paramList.add(dis.getEndTime());
paramList.add(dis.getCreatedBy());
paramList.add(dis.getCreatedTime());
paramList.add(dis.getUpdatedBy());
paramList.add(dis.getUpdatedTime());
paramList.add(dis.getIsLookback());
paramList.add(dis.getIsShield());
if (i >= 1000) {
Query query = entityManager.createNativeQuery(sb.toString() + ";");
int paramIndex = 1;
for (Object obj : paramList) {
query.setParameter(paramIndex++, obj);
}
query.executeUpdate();
i = 0;
paramList.clear();
sb = into();
}
}
if (i > 0) {
Query query = entityManager.createNativeQuery(sb.toString() + ";");
int paramIndex = 1;
for (Object obj : paramList) {
query.setParameter(paramIndex++, obj);
}
query.executeUpdate();
}
Long endTime = System.currentTimeMillis(); // 结束时间
log.info("-----------批量插入节目单数量:{}, 执行总耗时: {}ms", outChannelPlaybills.size(), (endTime - beginTime));
return outChannelPlaybills;
}
//sql前半段方法提取
private StringBuilder into(){
StringBuilder sb = new StringBuilder();
sb.append("insert into lp_distribute_success_playbill("
+ "layoutId,"
+ "outChannelId,"
+ "contentId,"
+ "asset_id,"
+ "type,"
+ "playUrl,"
+ "name,"
+ "displayName,"
+ "playType,"
+ "startTime,"
+ "endTime,"
+ "duration,"
+ "insertMode,"
+ "distributeStatus,"
+ "createdBy,"
+ "createdTime,"
+ "updatedBy,"
+ "updatedTime) values");
return sb;
}