Przyjęta odpowiedź nie jest zalecanym sposobem obsługi operacji wsadowych. Nie pokazuje prawdziwych instrukcji wsadowych, ponieważ podczas otwierania sesji należy używać trybu wsadowego. Zobacz ten post, w którym współautor kodu zalecił, że prawidłowym sposobem aktualizacji wsadowej (lub wstawiania) jest otwarcie sesji w trybie wsadowym i wielokrotne wywoływanie aktualizacji (lub wstawianie) dla pojedynczego rekordu.
Oto, co działa dla mnie:
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();
}
}
Nie używaj foreach w aktualizacji/wstawieniu i upewnij się, że aktualizuje/wstawia tylko jeden rekord. Wpadałem na nierozwiązywalne błędy wyroczni, robiąc to zgodnie z zaakceptowaną odpowiedzią (nieprawidłowy znak, niekończąca się wypowiedź itp.). Jak wskazuje link, aktualizacja (lub wstawka) pokazana w zaakceptowanej odpowiedzi jest w rzeczywistości tylko gigantyczną instrukcją sql.