Es können keine neuen Werte aus ArrayList in meine Datenbank eingefügt werden. Ich möchte alle ArrayList zu DB-Spalten Liste, Titel, über Werte aus ArrayLists pars.getListId (), getTitleId (), pars.getAboutAr () hinzufügen.
String query = "insert into test (list, title, about)" + "VALUES (?, ?, ?)";
try {
pars.htmlParse("hello");
PreparedStatement preparedStmt = db.getConnection().prepareStatement(query);
for (int i = 0; i < pars.getListId().size(); i++) {
preparedStmt.setString(1, pars.getListId().get(i));
preparedStmt.executeUpdate();
}
for (int i = 0; i < pars.getTitleId().size(); i++) {
preparedStmt.setString(2, pars.getTitleId().get(i));
preparedStmt.executeUpdate();
}
for (int i = 0; i < pars.getAboutAr().size(); i++) {
preparedStmt.setString(3, pars.getAboutAr().get(i));
preparedStmt.executeUpdate();
}
preparedStmt.execute();
} catch (IOException e1) {
e1.printStackTrace();
3 Antworten
Sie müssen alle drei Spalten festlegen, bevor Sie executeUpdate
einmal aufrufen.
Du machst:
preparedStmt.setString(1, pars.getListId().get(i));
preparedStmt.executeUpdate();
Sie setzen also nur den ersten Parameter in der vorbereiteten Anweisung und rufen dann executeUpdate
auf. Aber du musst alle drei haben.
Sie sollten eine Schleife haben, die alle drei zusammen einfügt:
for (int i = 0; i < pars.getListId().size(); i++) {
preparedStmt.setString(1, pars.getListId().get(i));
preparedStmt.setString(2, pars.getTitleId().get(i));
preparedStmt.setString(3, pars.getAboutAr().get(i));
preparedStmt.executeUpdate();
}
Dadurch werden alle drei Spalten in der Anweisung festgelegt, bevor sie ausgeführt wird. Sie erhalten also eine korrekte Einfügeanweisung mit allen festgelegten Werten.
Ein Problem hierbei ist, dass es vorkommen kann, dass pars.getListId()
beispielsweise 5 Elemente enthält, während pars.getTitleId()
und pars.getAboutAr()
4 Elemente enthalten. Wenn Sie dann die obige Schleife ausführen und i
den Wert 4
erreicht, erhalten Sie eine Ausnahme, da pars.getTitleId()
keinen Wert 4 hat (weil es nur 4 hat Artikel).
Dies kann mehrere Lösungen haben.
- Wenn Sie wissen, dass das Ergebnis Ihrer Analyse immer Listen gleicher Länge sind, ist dies kein Problem.
Sie können nur die Werte bis zur kürzesten Liste einfügen. Sie können eine Berechnung wie folgt haben:
int minSize = Collections.min( Arrays.asList( pars.getListId().size(), pars.getTitleId().size(), pars.getAboutAr().size() ) );
Und dann benutzen
for (int i = 0; i < minSize; i++) { preparedStmt.setString(1, pars.getListId().get(i)); preparedStmt.setString(2, pars.getTitleId().get(i)); preparedStmt.setString(3, pars.getAboutAr().get(i)); preparedStmt.executeUpdate(); }
Und dann erhalten Sie so viele Zeilen wie die kürzeste Liste.
Sie können mit der längsten Liste gehen (in der obigen Berechnung
max
anstelle vonmin
ausführen) und Nullen für die fehlenden Werte festlegen (dh prüfen, ob die Liste kürzer ist alsi
erforderlich Wenn ja, verwenden SiesetNull
anstelle vonsetString
.- Persönlich würde ich
pars
nicht so erstellen, wie Sie es getan haben, mit drei separaten Listen. Stattdessen würde ich eine Klasse mit dem NamenPar
oder was auch immer sinnvoll ist, erstellen, die die Felderid
,title
undabout
enthält. Dann würde ich eine einzelne Liste vonPar
Objekten in meinempars
anstelle von drei separaten Listen erstellen. Und dann haben Sie kein Problem mit unterschiedlichen Längen, und die Datenstruktur entspricht eher der in der Datenbank.
Sie müssen Ihren Code so ändern, dass er jeweils die Parameter 1, 2 und 3 hat, bevor Sie Update () ausführen.
Ich gehe davon aus, dass Ihre Listen die gleiche Anzahl von Einträgen haben (wird sonst kaputt gehen)
for (int i = 0; i < pars.getListId().size(); i++) {
preparedStmt.setString(1, pars.getListId().get(i));
preparedStmt.setString(2, pars.getTitleId().get(i));
preparedStmt.setString(3, pars.getAboutAr().get(i));
preparedStmt.executeUpdate();
}
Jetzt haben Sie alle 3 Sätze pro Einsatz.
Anstatt zu versuchen, jeden Parameter festzulegen und dann die Aktualisierung auszuführen, wodurch die Abfrage in einem ungültigen Zustand bleibt (da nicht alle Parameter festgelegt sind), sollten Sie für jedes Element jeden Parameter festlegen und dann die Aktualisierung ausführen.
Eine bessere Lösung wäre dann beispielsweise die Verwendung eines Stapelaktualisierungsprozesses
String query = "insert into test (list, title, about)" + "VALUES (?, ?, ?)";
try (PreparedStatement ps = con.prepareStatement(query)) {
pars.htmlParse("hello");
for (int index = 0; index < pars.getListId().size(); index++) {
ps.setString(1, pars.getListId().get(index));
ps.setString(2, pars.getTitleId().get(index));
ps.setString(3, pars.getAboutAr().get(index));
ps.addBatch();
}
ps.executeBatch();
} catch (SQLException exp) {
exp.printStackTrace();
}
Neue Fragen
java
Java ist eine Programmiersprache auf hoher Ebene. Verwenden Sie dieses Tag, wenn Sie Probleme haben, die Sprache selbst zu verwenden oder zu verstehen. Dieses Tag wird selten alleine verwendet und wird am häufigsten in Verbindung mit [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] und [maven] verwendet.