Vogliamo una soluzione performante e al sicuro da SQL Injection, per cui utilizzeremo questo approccio:
// l'oggetto ds è il datasource
DataSource ds = ...
// Questi sono i dati da inserire sul database
// facciamo finta che siano in una lista
List<Oggetto> rows = ...
// inseriamo le righe 1000 per volta
final int batchSize = 1000;
// query di inserimento singolo record
String query = "INSERT INTO tabella(campo1, campo2) VALUES(?, ?)";
// Procediamo con le insert via batch/commit
try(Connection connection=ds.getConnection(); PreparedStatement ps = connection.prepareStatement(query)) {
boolean previousAutocommit = connection.getAutoCommit();
// l'autocommit viene disabilitato
connection.setAutoCommit(false);
int count = 0;
for(Oggetto r: rows) {
ps.setObject(1, r.getCampo1());
ps.setObject(2, r.getCampo2());
ps.addBatch();
// al raggiungimento dei 1000 record facciamo il commit
if(++count>=batchSize) {
count = 0;
ps.executeBatch();
connection.commit();
}
}
// commit dell'eventuale ultimo blocco
// con meno di 1000 record rimanente
ps.executeBatch();
connection.commit();
}
finally {
connection.setAutoCommit(previousAutocommit);
}
Nel caso in cui il database utilizzato sia MySQL, avrete un incremento delle perfomance notevole aggiungendo questi due parametri di connessione: