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();
5
Mitchell 30 Dez. 2015 im 23:38

3 Antworten

Beste Antwort

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.

  1. Wenn Sie wissen, dass das Ergebnis Ihrer Analyse immer Listen gleicher Länge sind, ist dies kein Problem.
  2. 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.

  3. Sie können mit der längsten Liste gehen (in der obigen Berechnung max anstelle von min ausführen) und Nullen für die fehlenden Werte festlegen (dh prüfen, ob die Liste kürzer ist als i erforderlich Wenn ja, verwenden Sie setNull anstelle von setString.

  4. 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 Namen Par oder was auch immer sinnvoll ist, erstellen, die die Felder id, title und about enthält. Dann würde ich eine einzelne Liste von Par Objekten in meinem pars 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.
1
RealSkeptic 30 Dez. 2015 im 21:16

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.

0
Jan 30 Dez. 2015 im 21:02

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();
}
0
MadProgrammer 30 Dez. 2015 im 21:07