Musíte použít dávkové přílohy.
- Vytvořte rozhraní pro vlastní úložiště
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
- Vytvořte implementaci
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;
});
}
}
- Rozšiřte svůj
JpaRepository
sSomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
uložit
someRepository.batchSave(records);
Poznámky
Mějte na paměti, že pokud dokonce používáte dávkové vkládání, databázový ovladač je nepoužije. Například pro MySQL je nutné přidat parametr rewriteBatchedStatements=true
do databáze URL.Takže je lepší povolit řidiči protokolování SQL (ne Hibernate), aby se vše ověřilo. Může být také užitečné pro ladění kódu ovladače.
Budete se muset rozhodnout o rozdělení záznamů podle paketů ve smyčce
for (Record record : records) {
}
Řidič to může udělat za vás, takže ho nebudete potřebovat. Ale je lepší odladit i tuto věc.
P. S. Nepoužívejte var
všude.