Frage von flou1988, 45

Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben?

Hey Leute ich habe ein PHP Script, dass die Spalten zielg, ziels zielp usw. nach einer where Bedingung selektiert. Diese werden weiter unten einzeln über Arrays abgefragt und später wieder einzeln über eine for schleife in eine weitere Tabelle in der Datenbank über eine where Bedingung geupdatet.

Das gleiche benötige ich für ein Java Programm. Allerdings finde ich keinen geeigneten Ansatz. Ich habe das Internet schon durchforstet und in diversen Büchern danach gesucht. Die Erklärungen zu Arrays sind ziemlich primitiv und reichen mir für das Vorhaben nicht aus.

----------------------------------------Java Lösungsansatz------------------------------------------- Folgendes habe ich bereits in Java. Verbindung zum Datenbankserver

.
.
.

try {
        conn = DriverManager.getConnection(connectURL, user, pw);
        Statement stmt = conn.createStatement();
       

 String ankunft = "select zielg, ziels, zielp, Tran, RS from flt where aktion = 'stat' && Tran = 1";
        ResultSet resultf1 = stmt.executeQuery(ankunft);
    

    Ich schaffe es zwar die ausgwählten Datensätze in ein Array z.b. test[0] zu speichern, allerdings ist das für mein Vorhaben sinnlos, da ich die einzelnen Datensätze über test[0] und test[1] usw. abfragen möchte.
    
    stmt.close();
.
.
.



    

---------------------------------php Lösung-----------------------------------------------------------------

//Datenbanksätze selektieren

$fl="select zielg, ziels, zielp, Tran, RS from flt where aktion = 'stat' && Tran = 1 ";
$res4= mysqli_query($mysqli, $fl);

//Datenbanksätze in Array schreiben

$list = array();
while ($row = mysqli_fetch_assoc($res4)) {
   $list[] = $row;
} 

// Anzahl Reihen bestimmen und in Variable für for Schleife schreiben
$iz= mysqli_num_rows($res4);
$izb=$iz-1;


//Datensätze gezielt auswählen
echo "</br>";
echo $list[0]['zielg'], ":", $list[0]['ziels'], ":", $list[0]['zielp'], ":", $list[0]['RS'];;
echo "</br>";
echo $list[1]['zielg'], ":", $list[1]['ziels'], ":", $list[1]['zielp'], ":", $list[1]['RS'];;  


//Daten mit For Schleife in Datenbank updaten

for ($i=0; $i<=$izb; $i++)
{
   
$comres2="update Plan set Verm = Verm + '".$list[$i]['RS']."' where Ga ='".$list[$i]["zielg"]."' && So='".$list[$i]["ziels"]."' && Plan='".$list[$i]["zielp"]."' ";
$res123= mysqli_query($mysqli, $comres2);          
          

}

Ich hoffe mir kann der ein oder andere von euch helfen. Normal versuche ich die Hilfe über Fragen in Foren zu vermeiden, aber ich komme nicht weiter.

Expertenantwort
von KnusperPudding, Community-Experte für Java, 15

Solange dir die anzahl der Datensätze bekannt sind und eine Array die Bedingung ist, wäre es folgendermaßen:

int rowCounter = 0;
while(rs.next()){
rows[rowCounter] = rs.getString(0);
rowCounter++;
}

Nachdem dir meist nicht die anzahl der datensätze bekannt ist, solltest du eine (Array-)List verwenden um die Datensätze zu speichern, da du zuvor keine feste Größe angeben musst.

Kommentar von flou1988 ,

Danke schonmal für deine Antwort. Also die Anzahl der Datensätze sind von vornherein leider nicht bekannt und daher wäre eine Array List fast besser geeignet.

Kommentar von flou1988 ,

Ich muss noch erwähnen dass ich bisher folgendes hatte.

while(resultf1.next())

int[] a;
a=new int[5];
a[0]=resultf1.getInt("zielp");

}

dies liest allerdings alle zeilen der spalte zielp aus.

aber wie gesagt, ich benötige gezielt einzelne datensätze.

Kommentar von KnusperPudding ,

Also die Anzahl der Datensätze sind von vornherein leider nicht bekannt

Entsprechend wäre es dann:

List<String> rows = new ArrayList<>();
...

while(...) {
rows.add(rs.getString(0));
}

aber wie gesagt, ich benötige gezielt einzelne datensätze.

willst du nur bestimmte Zeilen haben, einfach via Bedingung:

if (rs.getString(0).equals...) {

nur deine relevanten Zeilen filtern.

Mit Datensätzen meinst du mehrere Spalten-Werte. Oder?

Entsprechend solltest du dir ein Datenhaltungsobjekt erstellen, was du z.b. Row nennst. - Die Felder deiner Abfrage deklarierst du dort als Eigenschaft und baust entsprechend Konstruktor, Getter und Setter dazu.

Deine Arraylist wäre dann vom Typ: Row und könnte so aussehen:

while (...) {
  rows.add(new Row(rs.getInt(0), rs.getString(1);
}
Kommentar von flou1988 ,

Danke dir für deine zahlreichen möglichkeiten. ich teste das ganze mal :-)

Kommentar von flou1988 ,

ich bräuchte doch nochmal deine hilfe.

Also wie gesagt.

Ich habe eine select anweisung die mir eine bis mehrere Zeilen

in der Datenbank mit allen Spaltenwerten ausgibt.

Von diesen Zeilen und Spalten möchte ich einzelne Werte abfragen,

die ich später für eine weitere Datenbankabfrage in der where Bedingung nutzen bzw. einzelne Werte in der Datenbank in eine Variable übergeben kann.

soviel ich verstanden habe ist new Row der Konstruktor und rs.getInt und rs.getString die beiden Getter.

rs.getInt holt sich die Zeile und rs.getString den Wert in der Spalte dieser Zeile!?

einen Setter brauch ich in diesem fall nicht da ich ja keine Daten zurückschreiben möchte, sondern nur auslesen.

Allerdings hat der Syntaxparser ein Problem mit new Row.

List rows = new ArrayList<>();

while( resultf1.next()) {

rows.add(new Row(rs.getInt(0), rs.getString(1);
}

wieso wird die ArrayList so aufgebaut :

List rows = new ArrayList<>();

was ist ist der unterschied zu

ArrayList<String> rows = new ArrayList<String>().

Zudem habe ich in mehreren Fällen den Einsatz eines Iterators gesehen der mit x.hasNext() arbeitet und als Zeiger zwischen den Werten hin und her wandert.

In den meisten Erklärungen finde ich nur einfache Array Beispiele oder Arraylisten. In Verbindung mit der Datenbankabfrage komme ich in Java völlig durcheinander.

Kommentar von flou1988 ,

oder sollte ich das eher so aufbauen

ArrayList<DR> rows = new ArrayList<Int>;

DR dr;

while(resultf1.next()) {

dr = new DR();

dr.setzielg(getInt(0), rs.getInt(0)),
dr.setziels(getInt(0), rs.getInt(1)),
rows.add(dr);

}

ich habs so noch nicht getestet.

Kommentar von KnusperPudding ,

soviel ich verstanden habe ist new Row der Konstruktor und rs.getInt und rs.getString die beiden Getter.

Ja und nein.

Beispiel:

class Row {

   private int id;

   public Row (int id) {
     this.id = id;
   }

  public int getID() {
     return this.id;
  }

  public void setID(int id){
     this.id = id;
  }

}

rs ist der Variablenname, den ich Testweise für Resultset vergeben habe. - Hier gibt es bereits getter.

mit der Schleife:

while (rs.next()) {
  ...
}

Bewirkt .next() dass die nächste Datenzeile geholt wird.

mit rs.getString z.b. holst du aus der neuen Zeile dann den entsprechenden Wert. Der Parameter ist dabei der Index der Spalte.

List rows = new ArrayList<>();

was ist ist der unterschied zu

ArrayList<String> rows = new ArrayList<String>().

Das nennt sich Polymorphie: List anstatt der Spezifischen Klasse zu verwenden, verschafft dir den Vorteil bei Bedarf die Klasse welche die Instanz bildet unkompliziert austauschen zu können.

Des weiteren stehen dir nur Methoden zur Verfügung, die das Interface List hast.

Den Generics-Typen sollte man mit angeben um die Vorteile von Generics nutzen zu können, also:

List<String> oder List<Row>. wodurch du ausschließlich Elemente und erlebende Elemente von String oder Row an die Liste anfügen kannst. Genauso erhälst du beim get jeweils direkt ein String oder eine Row.

Da du ja mehrere Spalten hast, lohnt sich das oben aufgeführte Beispiel: Sprich, du baust dir eine Klasse als Datenhaltungsobjekt, welche diverse Eigenschaften annehmen kann, die du mit set befüllst und mit get Abfragen kannst. Dadurch kannst du mehrere Spalten einer Zeile in ein Objekt speichern und bei bedarf die Werte davon wieder abrufen.

Keine passende Antwort gefunden?

Fragen Sie die Community