Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Inserção/Atualização em Lote MyBatis para Oracle


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.