# ResultSet variabel auslesen



## stetabar (25. Nov 2008)

Hallo zusammen,

ich bin gerade dabei, eine kleine Applikation zu schreiben, die aber sehr viel mit Datenbankdaten arbeitet. Da versteht es sich von selbst, dass ich sehr häufig auf die DB zugreifen muss.

Dabei ist es ja absolut problemlos Daten über Insert oder Update zu schreiben. Man erzeugt einfach den executeUpdate() und Thema durch.


```
Statement s = conn.createStatement(); 
s.executeUpdate(sql_statement);
```

Dabei ist es auch völlig egal, was in dem SQLStatement steht. Es bleibt immer die gleiche Syntax...

Nun habe ich aber auch eine Menge Select-Befehle und nerve mich gerade, dass ich für jeden Aufruf ein seperates ResultSet (bzw. die dazugehörige Schleife zum auslesen) erzeugen muss.

um die ID einer Tabelle auszulesen

```
statement = conn.createStatement();
ResultSet rs = statement.executeQuery(sql_statement);
while (rs.next()){
	id = rs.getInt("id");
}
```
um den Namen auszulesen

```
statement = conn.createStatement();
ResultSet rs = statement.executeQuery(sql_statement);
while (rs.next()){
	name = rs.getString("name");
}
```

usw.

Gibt es die Möglichkeit das auch allgemeiner zu gestalten? Also das ist jetzt kein gültiger code, aber so eine Idee, wie ich es mir vorstelle. Das alle Daten dann zB als Object aus der DB geholt werden und ich dann auf der anderen Seite mit den Daten richtig arbeiten muss. Heißt natürlich, dass sehr genau aufpassen muss, was den Datentyp angeht...


```
statement = conn.createStatement();
ResultSet rs = statement.executeQuery(sql_statement);
while (rs.next()){
	while (rs.nextcol()) {
		array[i][j] = rs.getcol();
		j++;
	}
j=0;
i++;
}
```

Danke im Vorfeld für eure Hilfe!!!


----------



## musiKk (25. Nov 2008)

Das geht schon, allerdings (leider) nicht ganz so einfach, wie in deinem Wunschbeispiel. Es gibt zu jedem ResultSet Metadaten, an die man per getMetaData() kommt. Damit kann man ziemlich generisch auf ResultSets reagieren. Wenn du ein bisschen durch die Dokumentation liest, findest du dich sicher zurecht. Ich finds recht deutlich alles, aber der Aufwand ist dennoch nicht gering.


----------



## semi (25. Nov 2008)

So ungefähr kannst du es machen
	
	
	
	





```
...
ResultSet rs = stmt.executeQuery("SELECT pommes, ketchup... FROM Kantine ...");
List<Map<String, Object>> result = new LinkedList<Map<String, Object>>();
if(rs.next())
{
   ResultSetMetaData rsmd = rs.getMetaData();
   Map<String, Object> prototypeRow = new HashMap<String, Object>(rsmd.getColumnCount());
   for(int i = 1, n = rsmd.getColumnCount(); i <= n; i++)
   {
      prototypeRow.put(rsmd.getColumnLabel(i), null);
   }
   do
   {
      Map<String, Object> currentRow = new HashMap<String, Object>(prototypeRow);
      for(Map.Entry<String, Object> column : currentRow.entrySet())
      {
         column.setValue(rs.getObject(column.getKey()));
      }
      result.add(currentRow);
   }
   while(rs.next());
}
...
```


----------



## stetabar (27. Nov 2008)

@semi: das sieht gut aus, vielen Dank, ich werde das mal testen! bin mal gespannt, ob ich das so hinbekomme...


----------



## stetabar (27. Nov 2008)

@semi: hat super geklappt! danke für die Hilfe!


----------

