sql >> Base de Datos >  >> RDS >> Oracle

usando foreach para hacer inserción por lotes con mybatis

Insertar dentro de Mybatis foreach no es por lotes , esta es una declaración SQL única (podría convertirse en gigante) y eso trae inconvenientes:

  • algunas bases de datos como Oracle aquí no son compatibles.
  • en casos relevantes:habrá una gran cantidad de registros para insertar y se alcanzará el límite configurado de la base de datos (de forma predeterminada, alrededor de 2000 parámetros por declaración), y eventualmente posiblemente se produzca un error de pila de base de datos si la declaración misma se vuelve demasiado grande.

La iteración sobre la colección no debe realizarse en mybatis XML. Simplemente ejecute un simple Insertar declaración en un Java Foreach loop.Lo más importante es el tipo de ejecutor de sesión .

SqlSession session = sessionFactory.openSession(ExecutorType.BATCH);
for (Model model : list) {
    session.insert("insertStatement", model);
}
session.flushStatements();

Creo que aquí será suficiente usar ExecutorType.REUSE sin vaciar declaraciones.

A diferencia del predeterminado ExecutorType.SIMPLE , la instrucción se preparará una vez y se ejecutará para cada registro que se inserte.