Für CRUD-Operationen auf einem Datensatz verwenden, es ist nett, einen Zwischentisch zu verwenden. Dies vermeidet die große Anzahl von Abfragen, die auf große Datenmengen gelegt werden.
Vor meinem Vorschlag geben, das Problem zu lösen, würde Ich mag einige Bemerkungen darauf hin, ich auf der Struktur der Datenbank habe:
- Die
total
Feld ist offensichtlich ein berechnetes Feld. Solche Informationen können nicht in die Datenbank eingegeben werden. Es wird auf Anfrage berechnet.
- Der gesamte Datensatz ist offensichtlich Teil eines Dokuments (Rechnung). Daher muss in der Datenbank ein Feld vorhanden sein, das das Dokument eindeutig identifiziert, auf das sich die Daten beziehen.
Auch ich möchte sagen, dass solche Entscheidungen für eine bestimmte Datenbank getroffen werden. In diesem Fall betrifft meine Lösung mysql.
Dies ist die DDL der Tisch, auf dem der untere Code-Schnipsel
CREATE TABLE `invoice` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`invoice_id` int(10) unsigned NOT NULL,
`description` varchar(255) DEFAULT NULL,
`qty` double DEFAULT NULL,
`unitprice` double DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB
läuft Und dies ist der Code, der Operationen CRUD auf einen Datensatz mit dem Dokument-ID-Taste (invoce_id
) macht.
public boolean save(long invoice_id, List<Invoice> list) throws SQLException {
try(Connection connection = getConnection()) {
try {
connection.setAutoCommit(false);
String query =
"create temporary table if not exists `invoice_tmp` (" +
"`id` int(10) unsigned NOT NULL," +
"`description` varchar(255) DEFAULT NULL," +
"`qty` double DEFAULT NULL," +
"`unitprice` double DEFAULT NULL)";
connection.createStatement().executeUpdate(query);
query = "insert into `invoice_tmp` values (?, ?, ?, ?)";
PreparedStatement statement = connection.prepareStatement(query);
for(Invoice invoice: list) {
statement.setLong(1, invoice.getId());
statement.setString(2, invoice.getDescription());
statement.setDouble(3, invoice.getQty());
statement.setDouble(4, invoice.getUnitPrice());
statement.addBatch();
}
statement.executeBatch();
statement.close();
query =
"delete invoice from invoice " +
"left join invoice_tmp on (invoice.id = invoice_tmp.id) " +
"where invoice_id = ? and invoice_tmp.id is null";
statement = connection.prepareStatement(query);
statement.setLong(1, invoice_id);
statement.executeUpdate();
statement.close();
query =
"update `invoice` " +
"join `invoice_tmp` using (`id`) " +
"set " +
"`invoice`.description = `invoice_tmp`.description, " +
"`invoice`.qty = `invoice_tmp`.qty, " +
"`invoice`.unitprice = `invoice_tmp`.unitprice";
connection.createStatement().executeUpdate(query);
query =
"insert into `invoice` (`invoice_id`, `description`, `qty`, `unitprice`) " +
"select ? as `invoice_id`, `description`, `qty`, `unitprice` from `invoice_tmp` where `id` = 0";
statement = connection.prepareStatement(query);
statement.setLong(1, invoice_id);
statement.executeUpdate();
statement.close();
connection.createStatement().executeUpdate("drop table if exists `invoice_tmp`");
connection.commit();
return true;
}
catch (Exception e) {
connection.rollback();
throw e;
}
}
}
this ist ein Testprojekt, wie Sie den Code oben genannten Arbeiten demonstriert.
Was ist Ihre Frage? –
Willkommen bei SO. Die bereitgestellten Informationen sind nicht ausreichend, um Ihnen zu helfen. Versuchen Sie, 'index' und' (String) tablesample.getValueAt (row, X) 'auszudrucken. Sie werden überrascht sein. – c0der
Ich versuche schon, den Index zu setzen: String sql = "UPDATE Rechnung SET Beschreibung =?, Menge =?, Unitprice =?" + ", gesamt =? WHERE id =" + index; aber die einzige kann aktualisieren ist die erste Zeile und die anderen werden die gleichen wie die erste Zeile –