A resposta aceita não é a maneira recomendada de lidar com operações em lote. Ele não mostra instruções de lote verdadeiras, pois o modo executor de lote deve ser usado ao abrir uma sessão. Veja esta postagem na qual um colaborador de código recomendou que a maneira correta de atualizar (ou inserir) em lote é abrir uma sessão no modo de lote e chamar repetidamente a atualização (ou inserção) para um único registro.
Aqui está o que funciona para mim:
public void updateRecords(final List<GisObject> objectsToUpdate) {
final SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession(ExecutorType.BATCH);
try {
final GisObjectMapper mapper = sqlSession.getMapper(GisObjectMapper.class);
for (final GisObject gisObject : objectsToUpdate) {
mapper.updateRecord(gisObject);
}
sqlSession.commit();
} finally {
sqlSession.close();
}
}
Não use foreach em sua atualização/inserção e certifique-se de que ele apenas atualize/insira um único registro. Eu estava me deparando com erros de oráculo insolúveis ao fazê-lo de acordo com a resposta aceita (caractere inválido, instrução não encerrada, etc.). Como a postagem vinculada indica, a atualização (ou inserção) mostrada na resposta aceita é na verdade apenas uma instrução sql gigante.