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.