Se posso, aggiungerei che il "controllo" con la SELECT è ridondante (utile e dà maggior sicurezza, ma ridondante, se si tratta solo di controllare la presenza o meno del record prima di inserire).
Se cerchi di inserire un record la cui chiave è già presente nella tabella, semplicemente l'inserimento andrà male da solo, senza bisogno della SELECT. In tal caso, l'executeUpdate() ritorna 0: ovvero, 0 record sono stati inseriti/modificati.
Quindi, potrebbe essere "sufficiente" tentare direttamente l'INSERT e valutare solo il valore di ritorno:
codice:
String sql = "INSERT ... INTO ...";
Statement stmt = con.createStatement();
int numRecord = stmt.executeUpdate( sql );
if (numRecord > 0) {
// Ok, il record è stato inserito
} else {
// Il record era già presente o si sono verificati altri errori
}
Questa è una delle tecniche utilizzate per l'ottimizzazione degli accessi a DB, quando si ha a che fare col noto problema "insert or update". L'approccio standard sarebbe questo:
1) Faccio una SELECT per sapere se il record c'è.
2) Se c'è faccio una UPDATE, se non c'è faccio una INSERT
Risultato: faccio sempre e comunque 2 query, quindi 2 accessi al DB... di cui uno sarebbe perfettamente inutile.
Approccio ottimizzato:
1) Faccio la INSERT
2) Se la INSERT è andata a buon fine ho finito, altrimenti faccio un'UPDATE
Nel caso peggiore faccio sempre 2 query, ma nel caso migliore ne faccio solo una.
Ciao.