# "while(rs.next)" - Schleife



## legalizeSINCE88 (12. Apr 2014)

Hallo zusammen,

folgendes Problem:
ich will Daten aus meiner Datenbank in eine Tabelle speichern.
Ich nutze also die "while(rs.next)" schleife und setze die Werte in einer "getter & setter" Klasse.
Danach hole ich mir die Werte wieder aus dieser Klasse.

Nun ist es aber so, das mir immer nur EIN Wert gespeichert wird und zwar de letze aus der DB.
Es ist also egal wieviel Einträge ich in meiner DB habe, nur der letzte davon wird in der Tabelle angezeigt.
(Übrigens auch beim traditionellen System.out.println...")

Danke für eure hilfe.

Hier die Codes:


```
package database;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.simple.JSONObject;


public class getData extends HttpServlet {
	private static final long serialVersionUID = 1L;

	Connection con;
	Statement stmt;
	ResultSet rs;
	Setzen setze = new Setzen();
	int zeilen;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		try{
		Class.forName("com.mysql.jdbc.Driver");
		con = DriverManager.getConnection("jdbc:mysql://localhost:3306/ausgaben","***","***");
		stmt = con.createStatement();
		rs = stmt.executeQuery("SELECT * FROM ausgaben");
		ResultSetMetaData meta = rs.getMetaData();
		zeilen = meta.getColumnCount();
		
		
		while(rs.next())
		{
		setze.setAusgaben(rs.getString("Ausgaben"));
		setze.setVom(rs.getString("vom"));
		setze.setPreis(rs.getString("Preis"));
		
		}
		
		rs.close();
		stmt.close();
		con.close();
		
		}catch(Exception e)
		{
			e.printStackTrace();
		}
		System.out.println(setze.getAusgaben());
		
		PrintWriter out = response.getWriter();
		String data = "{\"sEcho\":" + 3 + ",\"iTotalRecords\":" + zeilen + ", \"iTotalDisplayRecords\":" + zeilen + ",\"aaData\":[["+"\""+setze.getAusgaben()+"\""+","+"\""+setze.getVom()+"\""+","+"\""+setze.getPreis()+"\""+"]]}";
		System.out.println(data);
		out.print(data);
		
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
```




```
package database;

public class Setzen {
	
	String Ausgaben;
	String vom;
	String Preis;
	public String getAusgaben() {
		return Ausgaben;
	}
	public void setAusgaben(String ausgaben) {
		Ausgaben = ausgaben;
	}
	public String getVom() {
		return vom;
	}
	public void setVom(String vom) {
		this.vom = vom;
	}
	public String getPreis() {
		return Preis;
	}
	public void setPreis(String preis) {
		Preis = preis;
	}

}
```

--->Es geht mir also nur um die While Schleife - wieso diese nur eine Wert speichert ;-)


----------



## turtle (12. Apr 2014)

baue doch mal eine Ausgabe in die Schleife rein und schaue wie oft er da durch läuft.

Ich vermute, das du dann dein Problem erkennst



```
while(rs.next())
        {
        System.out.println("In Schleife"); // Ausgabe
        setze.setAusgaben(rs.getString("Ausgaben"));
        setze.setVom(rs.getString("vom"));
        setze.setPreis(rs.getString("Preis"));
        
        }
```


----------



## legalizeSINCE88 (12. Apr 2014)

@turtle ok er läuft so oft durch wie es Einträge in der DB gibt.
Überträgt jeden in die "G&S"Klasse und überschreibt diese dann jedesmal wieder?!

Muss ich das ganze dann mit einem Array lösen und dieses dann mit einer "for(String a : ArrayA)" auslesen?


----------



## turtle (12. Apr 2014)

Du hast ja "nur" ein Objekt "setze" und schreibst immer wieder in das eine Objekt die Werte mehrmals rein.

Du brauchst also genau so viele Objekte, wie du aus der DB liest, anlegen und jedes Einzelne mit den gelesenen Werten aus der DB füllen.


----------



## legalizeSINCE88 (12. Apr 2014)

Also in etwa so?!


* * * 
	
	
	
	





```
while(rs.next())

* * * * {

* * * * Setzen setzen = new Setzen ();

* * * * setze.setAusgaben(rs.getString("Ausgaben"));

* * * * setze.setVom(rs.getString("vom"));

* * * * setze.setPreis(rs.getString("Preis"));

* * * * 

* * * * }
```


----------



## turtle (13. Apr 2014)

Im Prinzip ja, aber...

Meistens möchtest du wohl mit dem Resultset noch etwas tun, also solltest du die Ergebnisse in einer Liste speichern und damit weiter arbeiten.

Eine solches Objekt, welches "nur" zum Transport der (DB)-Daten dient, nennt man übrigens *DTO *(Date-Transfer-Object) und benennt die Klasse oft danach, um dem Leser das Verständnis einfacher zu machen.

PS: Name der Klasse Setzen finde ich blöd siehe oben), besser vielleicht AusgabePreisDTO?


```
ResultSet rs = ....;
		List<Setzen> resultList = new ArrayList<>();
		while(rs.next()) {			 
			Setzen setzen = new Setzen ();			 
			setzen.setAusgaben(rs.getString("Ausgaben"));		
			setzen.setVom(rs.getString("vom"));			 
			setzen.setPreis(rs.getString("Preis"));	
			resultList.add(setzen);
		}
		// Hier mit der Ausgabeliste arbeiten
```


----------

