Mapper.xml
update t_risk_tolerance_answer trta
question=place.question,
answer=place.answer,
update_dt=place.updateDt:: timestamp with time zone,
update_user_id=place.updateUserId
from (
values
#{item.proposedCd},
#{item.seq},
#{item.question},
#{answer}
,
null,
#{item.updateDt},
null,
#{item.updateUserId}
null
) as place(
proposedCd,
seq,
question,
answer,
updateDt,
updateUserId
)
where
trta.proposed_cd = place.proposedCd
and trta.seq= place.seq
Service.java
@Transactional
public void updateBatch(List tRiskToleranceAnswerList) {
int groupSize = 300;
int groupNo = tRiskToleranceAnswerList.size() / groupSize;
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
TRiskToleranceAnswerMapper mapper = sqlSession.getMapper(TRiskToleranceAnswerMapper.class);
if (tRiskToleranceAnswerList.size() <= groupSize) {
mapper.updateBatch(tRiskToleranceAnswerList);
} else {
List subList=null;
for (int i = 0; i < groupNo; i++) {
subList = tRiskToleranceAnswerList.subList(0, groupSize);
mapper.updateBatch(subList);
tRiskToleranceAnswerList.subList(0, groupSize).clear();
}
if (tRiskToleranceAnswerList.size() > 0) {
mapper.updateBatch(tRiskToleranceAnswerList);
}
}
sqlSession.flushStatements();
}
100000条记录 16秒 4个字段 springboot2.0.7 mybatis3.4.6 postgresql9.4
网上还有一种处理方法是: 通过循环,依次执行update语句 。如下
update t_risk_tolerance_answer
question=#{item.question},
update_dt=#{item.updateDt},
update_user_id=#{item.updateUserId}
where
proposed_cd = #{item.proposedCd}
and seq= #{item.seq}
这种方法1、2万件数据的时候还是可以执行的。但是数据量更大,比如10万件处理的话,就会报错。