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

usando foreach para fazer inserção em lote com mybatis


Inserir dentro do Mybatis foreach não é em lote , esta é uma instrução SQL única (pode se tornar gigante) e isso traz desvantagens:
  • algum banco de dados como o Oracle aqui não suporta.
  • em casos relevantes:haverá um grande número de registros a serem inseridos e o limite configurado do banco de dados (por padrão, cerca de 2.000 parâmetros por instrução) será atingido e, eventualmente, possivelmente um erro de pilha de banco de dados se a própria instrução se tornar muito grande.

A iteração sobre a coleção não deve ser feita no XML do mybatis. Basta executar um simples Inserir declaração em um Java Foreach loop.O mais importante é o tipo de executor de sessão .
SqlSession session = sessionFactory.openSession(ExecutorType.BATCH);
for (Model model : list) {
    session.insert("insertStatement", model);
}
session.flushStatements();

Acho que aqui será suficiente usar ExecutorType.REUSE sem declarações de descarga.

Ao contrário do padrão ExecutorType.SIMPLE , a instrução será preparada uma vez e executada para cada registro a ser inserido.