Musisz użyć wstawek wsadowych.
- Utwórz interfejs dla niestandardowego repozytorium
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
- Utwórz implementację
SomeRepositoryCustom
@Repository
class SomesRepositoryCustomImpl implements SomeRepositoryCustom {
private JdbcTemplate template;
@Autowired
public SomesRepositoryCustomImpl(JdbcTemplate template) {
this.template = template;
}
@Override
public void batchSave(List<Record> records) {
final String sql = "INSERT INTO RECORDS(column_a, column_b) VALUES (?, ?)";
template.execute(sql, (PreparedStatementCallback<Void>) ps -> {
for (Record record : records) {
ps.setString(1, record.getA());
ps.setString(2, record.getB());
ps.addBatch();
}
ps.executeBatch();
return null;
});
}
}
- Rozszerz swoje
JpaRepository
zSomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
zapisać
someRepository.batchSave(records);
Notatki
Pamiętaj, że nawet jeśli używasz wstawek wsadowych, sterownik bazy danych nie będzie ich używał. Na przykład dla MySQL konieczne jest dodanie parametru rewriteBatchedStatements=true
do adresu URL bazy danych. Lepiej więc włączyć logowanie sterownika SQL (nie hibernację), aby wszystko zweryfikować. Może być również przydatny do debugowania kodu sterownika.
Musisz podjąć decyzję o podzieleniu rekordów na pakiety w pętli
for (Record record : records) {
}
Kierowca może to zrobić za Ciebie, więc nie będziesz tego potrzebować. Ale lepiej też to debugować.
PS Nie używaj var
wszędzie.