Java SQL Variable menge an Spalten ausgeben?
Hey, ich habe folgenden Code:
Connection con = DriverManager.getConnection(url, user, pass);
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("select * from staedteUSA;");
while(rs.next()){
System.out.println(rs.getString(1) + " " +
rs.getString(2) + " " +
rs.getString(3) + " " +
rs.getString(4));
}
Dieser lässt mich allerdings nur vier Spalten ausgeben. Wenn aber mein SQL Command SELECT * FROM... mehr als vier Spalten hat, werden dennoch nur vier ausgegeben. Wie kann ich diese variable lang machen, ohne dass ich es manuell in der While schleife untereinander eingeben muss?
Am liebsten mit Code Beispiel! :) Wäre sehr lieb. Danke schonmal im Vorraus!
LG
Niklas
3 Antworten
//Retrieving the ResultSetMetaData object
ResultSetMetaData rsmd = rs.getMetaData();
//getting the column type
int column_count = rsmd.getColumnCount();
Einfach die Anzahl der Spalten dynamisch beziehen und dann via for Loop durch diese hindurchgehen.
LG
Connection con = DriverManager.getConnection(url, user, pass);
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("select * from staedteUSA;");
ResultSetMetaData rsmd = rs.getMetaData();
int column_count = rsmd.getColumnCount();
while(rs.next())
{
for (int i = 0; i < column_count; i++)
{
System.out.print(rs.getString(i) + " ";
}
System.out.println("");
}
Das Leerzeichen am Schluss jeder Zeile dürfte nicht stören. Wenn doch, kannst du einfach trimmen. (Trim();)
Ist es nicht unfunktional wenn ich eine for in eine While packe?
Jein, manchmal ja - in dem Falle nicht, da es egal ist, ob du nun
System.out.println(rs.getString(1) + " " +
rs.getString(2) + " " +
rs.getString(3) + " " +
rs.getString(4));
Eingibst oder das über eine For-Schleife machst. :-)
LG
Danke! Habs grade versucht, leider kommt folgende Meldung: Der Index "0" liegt außerhalb des gültigen Bereichs. Danke schonmal!
Hier mal die Methode:
public static void execute() throws SQLException{
ConAndEx c = new ConAndEx();
Config w = new Config();
Statement stmt = c.getconn().createStatement();
ResultSet rs = stmt.executeQuery(w.getcommand());
ResultSetMetaData rsmd = rs.getMetaData();
int column_count = rsmd.getColumnCount();
while(rs.next())
{
for (int i = 0; i < column_count; i++)
{
System.out.print(rs.getString(i) + " ");
}
System.out.println("");
}}}
Oh, entschuldige - for (int i = 1; i <= column_count; i++)
Der GetString wird ja nicht bei einem Array ausgeführt. Deshalb wollte ich bei 0 anfangen. :o)
Klappt, danke dir!!!!! Kurze frage noch: Was macht genau dieses System.out.println("");? I mean es ist ja basicly leer aber ohne das bekomme ich ja keine ausgabe.
Das "ln" steht für Line - wir geben also "nichts" aus und springen eine Zeile runter. Print schreibt hingegen nur in eine Zeile. Ohne das Println würden wir also permanent in der selben Zeile bleiben.
Kann ich mir das eigentlich in einer richtigen Tabelle ausgeben lassen? Zumindest so dass die abstände gleich sind. Achso, hier der Code womit ich auch spalten anzeigen lasse:
for (int i = 1; i < column_count + 1; i++) {
String spaltenname = rsmd.getColumnName(i);
System.out.print(spaltenname);
}
System.out.print("\n");
while (rs.next()) {
for (int i = 1; i < column_count + 1; i++) {
System.out.print(rs.getString(i) + "\t");
}
System.out.println("");
}
Ah okay, könnte man nicht einfach \n dahinter packen und sich das sysoutln sparen? :D
Ah okay, könnte man nicht einfach \n dahinter packen und sich das sysoutln sparen? :D
Jup, das ginge. :-)
Display Output in Java Console as a Table | Code2care schau mal hier zur Frage, wie du das als Tabelle ausgeben lassen kannst.
ganz einfach -- gar nicht ;-)
"select *" ist nur für interaktives Entdecken, nicht für jdbc. Dort immer schön die gewünschten Spalten angeben.
Naja doch. Zum einen könnte die API die Spaltenanzahl liefern, zum anderem könnte man eine Schleife nehmen und solange inkrementieren, bis eine Exception geworfen wird, die man abfängt. Oder SQL verwenden, um die Anzahl der Spalten zu zählen. Oder SQL verwenden und damit im Katalog nachgucken (Hängt natürlich dann vom Back-End ab).
ja, es geht technisch. Trotzdem ist "select *" keine gute Idee an der Stelle.
nein, das macht nur allerseltents Sinn (z.B. wenn ich eine allgemeine Reporting-Engine bauen will, und selbst da geht es besser).
Vorher lieber den Katalog abfragen und dann eine ordentliche Query bauen.
"select *" in JDBC ist einfach Anfänger-Mist. Wenn ich Code Reviews mache lasse ich das nicht durchgehen. Just sayin.
Du kennst den genauen Anwendungsfall des Fragestellers überhaupt gar nicht (Das Beispiel in der Frage ist eben möglichwerweise nur ein Beispiel für einen komplexeren Fall) und es könnte sich um so einen seltenen Fall handeln. Deine Antwort "gar nicht" stimmt nicht, wie du bereits selbst schreibst.
Ja in einem Code-Review weißt du ja auch worum es geht.
Du schreibst: "ganz einfach -- gar nicht ;-)" und dann "ja, es geht technisch. ". Das ist ein Wiederspruch. Und ob es eine Anfänger-Frage ist, dass weißt du auch nicht.
Dultus hat dir bereits alles an die Hand gegeben. Selbstverständlich kannst Du eine For-Schleife innerhalb von While verschachteln aber ich rate dir aus designtechnischen Gründen das nicht so zu machen sondern alle Spalten immer voll qualifizieren und benamen, denn zu einem späterem Zeitpunkt weis niemand mehr was Parameter3 war.
Das ist ganz schlechter Stil und sollte unbedingt vermieden werden.
Das stimmt. :-)
Man sollte natürlich optimalerweise immer wissen, was man bekommt. Dafür nutzt man schlussendlich ja auch Interfaces und Delegaten.
Danke, genau das war auch mein gedanke, allerdings weiß ich nicht wie ich diesem loop da einbauen kann. Ist es nicht unfunktional wenn ich eine for in eine While packe? Hab da grad in meinem Kopf einen logik Fehler. Kannst du bitte kurz ein beispiel geben? :)