Datensätze aus einer DB als Objekte erzeugen und in ArrayList abspeichern

Status
Nicht offen für weitere Antworten.

javaCR

Mitglied
Hallo Java-Community!
Ich bin Java-Neuling und habe folgendes Problem. Will einzelne Datensätze (= Zeilen) aus einer AccessDB als Objekte in einer ArrayList speichern. Danach muss ich sowohl auf diese Objekte der ArrayList als auch auf die Eigenschaften der Einzelobjekte zugreifen können.

Nun mein Lösungsansatz:
Über eine Klasse ConnectionFactory hole ich mir die Vbdg zur Datenbank. Die Klasse DBManager ist das Bindeglied zur DB und liefert mir die Daten als ResultSet (Beides funktioniert!).

Hier der Programmcode der Klasse DBManager:

Java:
package kdsmanagement.common;

import java.sql.*;
import java.util.ArrayList;

import kdsmanagement.model.bo.*;
import java.lang.reflect.*;


public class DBManager {
	
	
	public static ArrayList<Sortimente> datensatzAuslesen()
	{
		ArrayList<Sortimente> allePakete = new ArrayList<Sortimente>();
	try
	{
	      Connection con = ConnectionFactory.getConnection();
	      Statement st = con.createStatement();
	      ResultSet ergebnis = st.executeQuery("select * from Pakete");
	      Sortimente sort = new Sortimente();
	      
	      ResultSetMetaData rsmd = ergebnis.getMetaData();
	      int numberOfColumns = rsmd.getColumnCount();
	      
	      
	      
	      while (ergebnis.next()) {
	          for (int i = 1; i <= numberOfColumns; i++) {
	            if (i > 1) System.out.print(", ");
	            String columnValue = ergebnis.getString(i);
	            System.out.print(columnValue);
	            }
	            System.out.println(""); 
	          }
	      
	      while (ergebnis.next()) 
	        {
	    	sort.setAuftragsnummer(ergebnis.getInt("Auftragsnummer"));
	        sort.setSchnittbild(ergebnis.getInt("Schnittbild"));
	        sort.setVerfuegbarkeitsdatum(ergebnis.getTimestamp("Verfuegbarkeitsdatum"));
	        sort.setLaenge(ergebnis.getInt("Laenge"));
	        sort.setBreite(ergebnis.getDouble("Breite"));
	        sort.setStaerke(ergebnis.getDouble("Staerke"));
	        sort.setPaketanzahl(ergebnis.getInt("Paketanzahlgerundet"));
	        sort.setPaketvolumen(ergebnis.getDouble("Paketvolumen"));  
	        
	        allePakete.add(sort);
	        System.out.println(allePakete.size());
	        } 
	      
	    ergebnis.close();
	    st.close();
	    con.close(); 
	    } 
	    catch(Exception ex) {
	      System.err.print("Exception: ");
	      System.err.println(ex.getMessage());
	      }
	return allePakete;
	    
	}


Ich kann mir sämtliche Daten auf der Konsole ausgeben lassen (= erste whileSchleife), allerdings schaffe ich es nicht, die Objekte der Klasse Sortimente zu bilden und in der ArrayList<Sortimente> zu speichern. Wenn ich mit der Methode allePakete.size() die Anzahl der Objekte ausgeben lassen, wird 0 zurückgegeben.

Hier der Code der Klasse Sortimente:
Java:
package kdsmanagement.model.bo;

import java.sql.*;

public class Sortimente {

	private int Auftragsnummer;
	private int Schnittbild;
	private Timestamp Verfuegbarkeitsdatum;
	private int Laenge;
	private double Breite;
	private double Staerke;
	private int Paketanzahl;
	private double Paketvolumen;	
	
	public void setAuftragsnummer(int Auftragsnummer){
		this.Auftragsnummer = Auftragsnummer;
	}
	
	public int getAuftragsnummer(){
		return (Auftragsnummer);
	}
	
	public void setSchnittbild(int Schnittbild){
		this.Schnittbild = Schnittbild;
	}
	
	public int getSchnittbild(){
		return (Schnittbild);
	}
	
	public void setVerfuegbarkeitsdatum(Timestamp Verfuegbarkeitsdatum){
		this.Verfuegbarkeitsdatum = Verfuegbarkeitsdatum;
	}
	
	public Timestamp getVerfuegbarkeitsdatum(){
		return (Verfuegbarkeitsdatum);
	}
	
	
	public void setLaenge(int Laenge){
		this.Laenge = Laenge;
	}
	
	public int getLaenge(){
		return (Laenge);
	}
	public void setBreite(double Breite){
		this.Breite = Breite;
	}
	
	public double getBreite(){
		return (Breite);
	}
	public void setStaerke(double Staerke){
		this.Staerke = Staerke;
	}
	
	public double getStaerke(){
		return (Staerke);
	}
	public void setPaketanzahl(int Paketanzahl){
		this.Paketanzahl = Paketanzahl;
	}
	
	public int getPaketanzahl(){
		return (Paketanzahl);
	}
	public void setPaketvolumen(double Paketvolumen){
		this.Paketvolumen = Paketvolumen;
	}
	
	public double getPaketvolumen(){
		return (Paketvolumen);
	}
	
	
}

Was mache ich falsch? Ich bitte um Hilfe bzw. Tipps!

Danke im Voraus!
 
Zuletzt bearbeitet von einem Moderator:
Du musst in deiner 2ten Schleife jedes mal ein ein neues Sortiment Objekt erzeugen und dieses dann in der Liste Aufnehmen...

Du addest jedes mal die gleiche Referenz und änderst dessen Attribute...
 
Danke für den Tipp!
Aber auch dieser code funktioniert nicht....

Java:
while (ergebnis.next()) 
	        {
for (int i = 1, i <= AnzahlDatensätze; i ++)
Sortimente i = new Sortimente();
i.setAuftragsnummer(ergebnis.getInt("Auftragsnummer"));
	        i.setSchnittbild(ergebnis.getInt("Schnittbild"));
	        i.setVerfuegbarkeitsdatum(ergebnis.getTimestamp("Verfuegbarkeitsdatum"));
	        i.setLaenge(ergebnis.getInt("Laenge"));
	        i.setBreite(ergebnis.getDouble("Breite"));
	        i.setStaerke(ergebnis.getDouble("Staerke"));
	        i.setPaketanzahl(ergebnis.getInt("Paketanzahlgerundet"));
	        i.setPaketvolumen(ergebnis.getDouble("Paketvolumen"));  
	        
	        allePakete.add(i);
	        System.out.println(allePakete.size());


Hab ich einen Fehler in der Schleife?
 
Zuletzt bearbeitet von einem Moderator:
Java:
while (ergebnis.next()) 
{
    for (int i = 1, i <= AnzahlDatensätze; i ++)
        Sortimente i = new Sortimente();
    i.setAuftragsnummer(ergebnis.getInt("Auftragsnummer"));
    ...
Das sieht mal gar nicht richtig aus, weil du hier pro Ergebnis einige neue Objekte erstellst. Und wenn ich genauer hinschaue, kompiliert das nichtmal, weil i einmal ein int, einmal ein Sortimente ist... ???:L

In deinem ersten Post müsste es schon gehen, wenn du in der
Code:
while (ergebnis.next())
-Schleife am Anfange folgende Zeile setzt:
Code:
sort = new Sortimente();
Sprich:
Java:
while (ergebnis.next()) 
{
    sort = new Sortimente();
    sort.setAuftragsnummer(ergebnis.getInt("Auftragsnummer"));
    sort.setSchnittbild(ergebnis.getInt("Schnittbild"));
    sort.setVerfuegbarkeitsdatum(ergebnis.getTimestamp("Verfuegbarkeitsdatum"));
    sort.setLaenge(ergebnis.getInt("Laenge"));
    sort.setBreite(ergebnis.getDouble("Breite"));
    sort.setStaerke(ergebnis.getDouble("Staerke"));
    sort.setPaketanzahl(ergebnis.getInt("Paketanzahlgerundet"));
    sort.setPaketvolumen(ergebnis.getDouble("Paketvolumen"));  
	        
    allePakete.add(sort);
    System.out.println(allePakete.size());
}


Bedenke was du möchtest: Pro gelesenem Datensatz ein(!) neues Objekt erzeugen, dass die Daten aus diesem Satz bekommt. Dieses Objekt möchtest du in eine Liste stecken. Bisher steckst du immer das gleiche Objekt in die Liste.
 
Glaub ich steh auf der Leitung..... Entschuldigt die trivialen Fragen, aber bin Java-Neuling! :-(
Ich muss ja pro Datensatz ein neues Objekt mit anderem Namen erzeugen. Wie soll das gehen? Wenn ich das ResultSet ergebnis mit next durchlaufe wie im Beispielcode unterhalb dargestellt, wird ja jedesmal das gleiche Objekt "sort" erzeugt. Wie schaffe ich es, dass ich für jede Zeile ein neues Objekt vom Typ Sortimente erzeuge? zb. sort1, sort2, sort3 etc.?

Java:
      while (ergebnis.next()) 
	        {
	    	Sortimente sort = new Sortimente; 
sort.setAuftragsnummer(ergebnis.getInt("Auftragsnummer"));
	        sort.setSchnittbild(ergebnis.getInt("Schnittbild"));
	        sort.setVerfuegbarkeitsdatum(ergebnis.getTimestamp("Verfuegbarkeitsdatum"));
	        sort.setLaenge(ergebnis.getInt("Laenge"));
	        sort.setBreite(ergebnis.getDouble("Breite"));
	        sort.setStaerke(ergebnis.getDouble("Staerke"));
	        sort.setPaketanzahl(ergebnis.getInt("Paketanzahlgerundet"));
	        sort.setPaketvolumen(ergebnis.getDouble("Paketvolumen"));  
	        
	        allePakete.add(sort);
	        System.out.println(allePakete.size());


Um kurzen Beispielcode oder weitere Tipps wäre ich sehr dankbar. Bin echt am verzweifeln! :-(

Danke!
 
Zuletzt bearbeitet von einem Moderator:
ja, das dachte ich auch..... Aber wenn ich mir die Anzahl der Objekte in der Liste (allePakete.size()) auf der Konsole ausgeben lasse, wird "0" ausgegeben.... Hab keine Ahnung wo das Problem liegen könnte! :-(
 
Poste doch mal den Code, wie er jetzt ausschaut. Im Code aus dem ersten Post hast Du zweimal hintereinander
Code:
while (ergebnis.next()) {
wodurch die zweite Schleife niemals ausgeführt wurde.
 
Code:
package kdsmanagement.common;
import java.sql.*;
import java.util.*;

import kdsmanagement.model.bo.*;
import java.lang.reflect.*;


public class DBManager {
	
	
	public static ArrayList<Sortimente> datensatzAuslesen()
	{
		ArrayList<Sortimente> allePakete = new ArrayList<Sortimente>();
		
	try
	{
	      Connection con = ConnectionFactory.getConnection();
	      Statement st = con.createStatement();
	      ResultSet ergebnis = st.executeQuery("select * from Pakete");
	      
	      
	      
	      /*while (ergebnis.next()) {
	          for (int i = 1; i <= numberOfColumns; i++) {
	            if (i > 1) System.out.print(", ");
	            String columnValue = ergebnis.getString(i);
	            System.out.print(columnValue);
	            }
	            System.out.println(""); 
	          }*/
	      
	      while (ergebnis.next()) {
	    	
	    	Sortimente sort = new Sortimente();
	    	  
	    	sort.setAuftragsnummer(ergebnis.getInt("Auftragsnummer"));
	        sort.setSchnittbild(ergebnis.getInt("Schnittbild"));
	        sort.setVerfuegbarkeitsdatum(ergebnis.getTimestamp("Verfuegbarkeitsdatum"));
	        sort.setLaenge(ergebnis.getInt("Laenge"));
	        sort.setBreite(ergebnis.getDouble("Breite"));
	        sort.setStaerke(ergebnis.getDouble("Staerke"));
	        sort.setPaketanzahl(ergebnis.getInt("Paketanzahlgerundet"));
	        sort.setPaketvolumen(ergebnis.getDouble("Paketvolumen"));  
	        
	        allePakete.add(sort);
	        System.out.println(allePakete.size());
	        } 
	      
	    ergebnis.close();
	    st.close();
	    con.close(); 
	    }
	    catch(Exception ex) {
	      System.err.print("Exception: ");
	      System.err.println(ex.getMessage());
	      }
	
	    return allePakete;
	    
	}


Code:
package kdsmanagement.model.bo;
import java.sql.*;

public class Sortimente {

	private int Auftragsnummer;
	private int Schnittbild;
	private Timestamp Verfuegbarkeitsdatum;
	private int Laenge;
	private double Breite;
	private double Staerke;
	private int Paketanzahl;
	private double Paketvolumen;
	
	
	

	public Sortimente() {
		// TODO Automatisch erstellter Konstruktoren-Stub
	}

	public void setAuftragsnummer(int Auftragsnummer){
		this.Auftragsnummer = Auftragsnummer;
	}
	
	public int getAuftragsnummer(){
		return (Auftragsnummer);
	}
	
	public void setSchnittbild(int Schnittbild){
		this.Schnittbild = Schnittbild;
	}
	
	public int getSchnittbild(){
		return (Schnittbild);
	}
	
	public void setVerfuegbarkeitsdatum(Timestamp Verfuegbarkeitsdatum){
		this.Verfuegbarkeitsdatum = Verfuegbarkeitsdatum;
	}
	
	public Timestamp getVerfuegbarkeitsdatum(){
		return (Verfuegbarkeitsdatum);
	}
	
	
	public void setLaenge(int Laenge){
		this.Laenge = Laenge;
	}
	
	public int getLaenge(){
		return (Laenge);
	}
	public void setBreite(double Breite){
		this.Breite = Breite;
	}
	
	public double getBreite(){
		return (Breite);
	}
	public void setStaerke(double Staerke){
		this.Staerke = Staerke;
	}
	
	public double getStaerke(){
		return (Staerke);
	}
	public void setPaketanzahl(int Paketanzahl){
		this.Paketanzahl = Paketanzahl;
	}
	
	public int getPaketanzahl(){
		return (Paketanzahl);
	}
	public void setPaketvolumen(double Paketvolumen){
		this.Paketvolumen = Paketvolumen;
	}
	
	public double getPaketvolumen(){
		return (Paketvolumen);
	}

}

Danke für den Tipp! Jetzt funktionierts. Die erste Schleife war der Grund allen übels! Dieser Code funktioniert jetzt.....

Vielen, vielen Dank nochmal!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

:applaus:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben