Oracle
 sql >> Datenbank >  >> RDS >> Oracle

MyBatis Batch Insert/Update für Oracle

Die akzeptierte Antwort ist nicht die empfohlene Methode zur Handhabung von Stapelvorgängen. Es werden keine echten Batch-Anweisungen angezeigt, da beim Öffnen einer Sitzung der Batch-Executor-Modus verwendet werden sollte. Sehen Sie sich diesen Beitrag an, in dem ein Code-Mitwirkender empfahl, dass die richtige Methode zum Batch-Update (oder Einfügen) darin besteht, eine Sitzung im Batch-Modus zu öffnen und wiederholt Update (oder Insert) für einen einzelnen Datensatz aufzurufen.

Hier ist, was für mich funktioniert:

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();
    }
}

Verwenden Sie foreach nicht in Ihrem Update/Insert und stellen Sie sicher, dass nur ein einzelner Datensatz aktualisiert/eingefügt wird. Ich bin auf unlösbare Orakelfehler gestoßen, indem ich es gemäß der akzeptierten Antwort gemacht habe (ungültiges Zeichen, Anweisung nicht beendet usw.). Wie der verlinkte Beitrag zeigt, ist die in der akzeptierten Antwort gezeigte Aktualisierung (oder Einfügung) eigentlich nur eine riesige SQL-Anweisung.