Einfügen in Mybatis foreach ist kein Stapel , dies ist eine einzige (könnte riesig werden) SQL-Anweisung und das bringt Nachteile mit sich:
- Einige Datenbanken wie Oracle hier werden nicht unterstützt.
- in relevanten Fällen:Es muss eine große Anzahl von Datensätzen eingefügt werden, und das konfigurierte Datenbanklimit (standardmäßig etwa 2000 Parameter pro Anweisung) wird erreicht, und möglicherweise ein DB-Stack-Fehler, wenn die Anweisung selbst zu groß wird.
Iteration über die Sammlung darf nicht im mybatis XML erfolgen. Führen Sie einfach ein einfaches Insert aus -Anweisung in einem Java-Foreach loop.Das Wichtigste ist der Session-Executor-Typ .
SqlSession session = sessionFactory.openSession(ExecutorType.BATCH);
for (Model model : list) {
session.insert("insertStatement", model);
}
session.flushStatements();
Ich denke, dass es hier ausreichen wird, ExecutorType.REUSE zu verwenden ohne Spülanweisungen.
Anders als standardmäßig ExecutorType.SIMPLE , wird die Anweisung einmal vorbereitet und für jeden einzufügenden Datensatz ausgeführt.