JDBC Methode in Datenbanken

pg1337

Bekanntes Mitglied
Hallo liebe Community.

Ich benutze die Datenbank PostgreSQL und habe mich mal an das Thema JDBC gemacht.
Abfragen mit SQL gehen schon recht gut.
Das Verbinden mit der Datenbank über Eclipse, das Laden des Drivers etc funktioniert alles einwandfrei.

Habe eine Datenbank mit der Tabelle "cities" erstellt, in der Städte aufgezählt werden sowie ihre Bevölkerungsanzahl und Größe in km².
Das Auslesen dieser Daten ist kein Problem, soweit hier mal mein code:


Java:
import java.sql.*;



public class Uebung {

	private static final String URL = "jdbc:postgresql://localhost:5432/mydb",
			USER = "postgres", PASSWORD = "XXX";
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException
	{
		Statement stmt= null;
		ResultSet rs= null;
	
		try
		{
			Class.forName("org.postgresql.Driver").newInstance();
			Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
			stmt= conn.createStatement();
			String query= "SELECT* FROM cities WHERE population= 680000";
			rs= stmt.executeQuery(query);
			//stmt.executeUpdate("DELETE* FROM cities WHERE name='Berlin'");
			System.out.println("Name der Städe: ");
			System.out.println("");
			while (rs.next()) {
				System.out.println(rs.getString("name"));
				System.out.println(rs.getString("population"));
				System.out.println(rs.getString("groesse"));
				
			}
			if (stmt.execute("SELECT population FROM cities")) {
				rs= stmt.getResultSet();
			}
			
			
		} finally {
		
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException sqlEx) {
					
				}
				
				rs= null;
			}
			
			if (stmt != null) {
				try {
					stmt.close();
				} catch (SQLException sqlEx) {
					
				}
				stmt= null;
			}
			
		}
	}

}


Nun möchte ich aber eine Methode definieren, die getCityByName() heißen soll.
In dieser wird definiert, dass auf Eingabe einer Stadt, zum Beispiel 'New York' alle Daten der Stadt New York ausgegeben werden sollen.
Mir ist nicht ganz klar, wie diese jetzt auszusehen hat und wo diese überhaupt definiert wird.
Ich bitte um Hilfe & bedanke mich schonmal für jeden hilfreichen Beitrag,


Gruß,
pg1337
 
Zuletzt bearbeitet:
C

Camino

Gast
Hallo,

im Moment machst du alles noch in deiner main-Methode. Das wird auf Dauer wahrscheinlich unübersichtlich. Damit da auch mal ein bisschen objektorientiert reinkommt, könntest du in der main-Methode ein Objekt der Klasse Uebung erzeugen und dann dort deine Datenbankabfragen machen. Und dort könntest du dann auch die gewünschte Methode getCityByName() erstellen. (Wenn das alles noch grösser wird, wirst du das wahrscheinlich irgendwann in mehrere Klassen aufteilen, z.B. eine Klasse nur für die Datenbankverbindung.)

Und in dieser Methode hast du dann eben eine Datenbankabfrage, die den Datensatz der Stadt New York holt (WHERE name = 'New York').
 

pg1337

Bekanntes Mitglied
Hallo,

im Moment machst du alles noch in deiner main-Methode. Das wird auf Dauer wahrscheinlich unübersichtlich. Damit da auch mal ein bisschen objektorientiert reinkommt, könntest du in der main-Methode ein Objekt der Klasse Uebung erzeugen und dann dort deine Datenbankabfragen machen. Und dort könntest du dann auch die gewünschte Methode getCityByName() erstellen. (Wenn das alles noch grösser wird, wirst du das wahrscheinlich irgendwann in mehrere Klassen aufteilen, z.B. eine Klasse nur für die Datenbankverbindung.)

Und in dieser Methode hast du dann eben eine Datenbankabfrage, die den Datensatz der Stadt New York holt (WHERE name = 'New York').


Du meinst es wäre sinnvoller eine neue Klasse zu erstellen?
Dann würde ich eine neue Klasse "City" erzeugen.
Dort würde ich ein Objekt: City cities= new City(); erzeugen.

Nun noch eine Frage:
Kommt danach auch die Connection rein? Also:

Java:
Class.forName("org.postgresql.Driver").newInstance();
            Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
            stmt= conn.createStatement();


Gruß :)
 
C

Camino

Gast
Na ja, du kannst dir überlegen, ob du erst mal so weitermachst und schaust, wann es dir zu gross und unübersichtlich wird. Prinzipiell kannst du alles in einer Klasse machen. Ist aber unschön und eigentlich auch nicht der Sinn von Java.

Du könntest dann halt nach und nach Sachen in andere Klassen auslagern, z.B. die Datenbankverbindung, wenn du die öfters brauchst. Dann hast du z.B. eine Klasse, welche dir ein Connection-Objekt zurückliefert, mit der du dann dein Statement zur Datenbank schicken kannst.

Dann brauchst du evtl. eine Klasse, in der du die verschiedenen SQL-Abfragen hast. Je nachdem, was du von der Datenbank abfragen möchtest. Später in einer GUI wählst du diese Abfragen dann z.B. über Buttons aus.

Die Klasse City kannst du dann auch anlegen. In der werden dann die abgefragten Werte aus der Datenbank zu der jeweiligen Stadt gespeichert (über Konstruktor oder setter-Methoden) und über getter-Methoden abgefragt.
 

pg1337

Bekanntes Mitglied
puh also versuche es erstmal in der Main-Methode, verstehe das aber nicht ganz.

ich schreibe jetzt:

Java:
import java.sql.*;



public class Uebung {

	private static final String URL = "jdbc:postgresql://localhost:5432/mydb",
			USER = "postgres", PASSWORD = "123";
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException
	{
		Statement stmt= null;
		ResultSet rs= null;
	
		try
		{
			Class.forName("org.postgresql.Driver").newInstance();
			Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
			stmt= conn.createStatement();
			Uebung d= new Uebung();
 

pg1337

Bekanntes Mitglied
puh also versuche es erstmal in der Main-Methode, verstehe das aber nicht ganz.

ich schreibe jetzt:

Java:
import java.sql.*;



public class Uebung {

	private static final String URL = "jdbc:postgresql://localhost:5432/mydb",
			USER = "postgres", PASSWORD = "123";
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException
	{
		Statement stmt= null;
		ResultSet rs= null;
	
		try
		{
			Class.forName("org.postgresql.Driver").newInstance();
			Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
			stmt= conn.createStatement();
			Uebung d= new Uebung();

Oder wo kommt da die Methode rein und was muss in sie rein? Bitte um Hilfe :s
 
C

Camino

Gast
Ich würde erst mal in der main-Methode nur ein Objekt der Klasse Uebung erzeugen, und dann in der Klasse Uebung das mit der Datenbankverbindung und der Abfrage machen. Und danach dann weitere Klassen erstellen, z.B. die Datenbankverbindung in eine eigene Klasse auslagern.
 

pg1337

Bekanntes Mitglied
Java:
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException
	{
		Statement stmt= null;
		ResultSet rs= null;
	
               d.getAllCities();

		try
		{
			Class.forName("org.postgresql.Driver").newInstance();
			Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
			stmt= conn.createStatement();
			Uebung d= new Uebung();
		
                        public String getAllCities()
                        {                       
 			String query= "SELECT* FROM cities";
			rs= stmt.executeQuery(query);
			
			System.out.println("Name der Städe: ");
			System.out.println("");
			while (rs.next()) {
				System.out.println(rs.getString("name"));
				System.out.println(rs.getString("population"));
				System.out.println(rs.getString("groesse"));
                       }
                 }


So dann oder wie?:/
 
C

Camino

Gast
Hmmm, das sind eher grundsätzliche Fehler und Probleme mit Java, als mit Datenbanken. Warte mal kurz, ich versuch dir das mal neu aufzuschreiben...
 
C

Camino

Gast
Na ja, so grob würde es etwa so aussehen:

Java:
public class Uebung{

   // Konstruktor
   public Uebung() {

      // Methode aufrufen
      getCityByName();

   }

   // Methode für Datenbankverbindung
   private Connection getConnection(){

      // hier wird die Verbindung zur Datenbank hergestellt und Connection zurückgeliefert
      // Das brauchst du dann für jedes Statement (Connection wieder schliessen nicht vergessen)

   }


   // Methode um bestimmte Stadt auszulesen
   private void getCityByName(){

      // hier ResultSet und Statement
      // Verbindung zur DB holen
      Connection conn = getConnection();

      // Dann DB-Abfrage und ResultSet ausgeben

      // Connection wieder schliessen
      conn.close();

   {


   // main-Methode (startet das Programm)
   public static void main(String[] args){

      // erzeugt ein Objekt der Klasse Uebung
      new Uebung();

   }

}

Ist halt wie gesagt ziemlich grob und es fehlen natürlich noch ein paar Sachen.
 

pg1337

Bekanntes Mitglied
Na ja, so grob würde es etwa so aussehen:

Java:
public class Uebung{

   // Konstruktor
   public Uebung() {


   }

   // Methode für Datenbankverbindung
   private Connection getConnection(){

      // hier wird die Verbindung zur Datenbank hergestellt und Connection zurückgeliefert
      // Das brauchst du dann für jedes Statement (Connection wieder schliessen nicht vergessen)

   }


   // Methode um bestimmte Stadt auszulesen
   private void getCityByName(){

      // hier ResultSet und Statement
      // Verbindung zur DB holen
      Connection conn = getConnection();

      // Dann DB-Abfrage und ResultSet ausgeben

      // Connection wieder schliessen
      conn.close();

   {


   // main-Methode (startet das Programm)
   public static void main(String[] args){

      // erzeugt ein Objekt der Klasse Uebung
      new Uebung();

   }

}

Ist halt wie gesagt ziemlich grob und es fehlen natürlich noch ein paar Sachen.


Vielen Dank ich füge das mal so alles ein wie ich glaube dass es stimmt und poste es hier dann gleich nochmal.

Vielen Dank schonmal!
 
C

Camino

Gast
Je nachdem, von wo du deine Methode getCityByName() aufrufst, musst du die natürlich evtl. von private auf public umstellen.

Möglich wäre ja auch ein Aufruf der Methode in der main:

Java:
   // main-Methode (startet das Programm)
   public static void main(String[] args){
 
      // erzeugt ein Objekt der Klasse Uebung
      Uebung uebung1 = new Uebung();

      // Aufruf der Methode des Objektes uebung1
      uebung1.getCityByName();
 
   }
 

pg1337

Bekanntes Mitglied
Java:
import java.sql.*;

public class Uebung{
	
	private static final String URL = "jdbc:postgresql://localhost:5432/mydb",
			USER = "postgres", PASSWORD = "123";
	
	Statement stmt= null;
	ResultSet rs= null;

 
   // Konstruktor
   public Uebung() {
 
 
   }
 
   // Methode für Datenbankverbindung
   private Connection getConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException 
   {	
			Class.forName("org.postgresql.Driver").newInstance();
			Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
			return conn;
   }
 
 
   // Methode um bestimmte Stadt auszulesen
   private void getAllCities() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
 
	   Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
	   stmt= conn.createStatement();
	   String query= "SELECT* FROM cities";
	   rs= stmt.executeQuery(query);
	   
		
      // hier ResultSet und Statement
      // Verbindung zur DB holen
      //Connection conn = getConnection();
 
      // Dann DB-Abfrage und ResultSet ausgeben
	   System.out.println("Name der Städe: ");
	   System.out.println("");
		while (rs.next()) {
			System.out.println("Namen der Städte: " + rs.getString("name"));
		}
      // Connection wieder schliessen
      conn.close();
 
   }
 
 
   // main-Methode (startet das Programm)
   public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
 
		
      // erzeugt ein Objekt der Klasse Uebung
      Uebung uebung= new Uebung();
      uebung.getAllCities();
 
   }
 
}

Habe es jetzt so gemacht und es funktioniert!
Vielen vielen Dank!
Das war jetzt die Methode getAllCities() jetzt versuche ich die getCityByName().

:)
 

pg1337

Bekanntes Mitglied
Jetzt habe ich glaube ich aber nicht die Methode :

Java:
  private Connection getConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException 
   {    
            Class.forName("org.postgresql.Driver").newInstance();
            Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
            return conn;
   }

aufgerufen, oder? :s
Da ist jetzt was doppelt gemoppelt..
 

pg1337

Bekanntes Mitglied
Jetzt habe ich glaube ich aber nicht die Methode :

Java:
  private Connection getConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException 
   {    
            Class.forName("org.postgresql.Driver").newInstance();
            Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
            return conn;
   }

aufgerufen, oder? :s
Da ist jetzt was doppelt gemoppelt..


Java:
// Methode um bestimmte Stadt auszulesen
   private void getAllCities() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
 
	   Connection conn= getConnection(); //DriverManager.getConnection(URL, USER, PASSWORD);
	   stmt= conn.createStatement();
	   String query= "SELECT* FROM cities";
	   rs= stmt.executeQuery(query);

erledigt. sorry
 
C

Camino

Gast
Ja, sieht schon besser aus... Du brauchst in deinen Methoden aber nicht mehr
Java:
Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
dafür hast du ja die Methode getConnection, welche dir die Connection zurückliefert, d.h. du kannst in jede Methode, in welcher du eine DB-Abfrage machst, reinschreiben:
Java:
Connection conn = getConnection();
und dann mit diesem conn weiterarbeiten.
 
C

Camino

Gast
Ich würde ResultSet und Statement auch jeweils in die Methoden mit reinnehmen und dort anlegen. Du solltest auf jeden Fall nach der Abfrage mit close() alles wieder schliessen, die Connection, das Statement und evtl. auch das ResultSet (kann aber auch sein, dass das ResultSet mit Schliessen des Statement geschlossen wird, musst du nochmal genauer nachschauen).
 
C

Camino

Gast
Jetzt ist die Frage aber, wie ich dort einen Scanner einbaue?
Also dass ich eine Stadt in die Console eingeben kann in Eclipse und ich von dieser die Werte aus der Datenbank bekomme?

Objekt Scanner anlegen:

Scanner scan= new Scanner();

und dann? Oder geht das auch einfacher?

Gruß :)

Hmm, weiss ich leider auch nicht genau. Musst du mal im Internet suchen, sowas wie "Eingabe über Konsole", wenn du noch keine GUI hast und über die Konsole arbeitest.
 

pg1337

Bekanntes Mitglied
Hmm, weiss ich leider auch nicht genau. Musst du mal im Internet suchen, sowas wie "Eingabe über Konsole", wenn du noch keine GUI hast und über die Konsole arbeitest.

Das mit dem Scanner hat sich erledigt.. weiß nur nicht wie man Beiträge hier löschen kann.

Habe mir überlegt das jetzt so zu machen:

Ich habe die Klasse Uebung.

in der erstelle ich eine Liste:
public List<City> getAllCities();

Nachher erstelle ich mir dann eine neue Klasse "City" mit der main Methode:

Uebung e= new Uebung();
List<City> all= e.getAllCities();

Also die frage nun, wie das mit Listen geht?

Die Aufgabenstellung ist also:

Klasse Uebung:
public List<City> getAllCities();

Klasse City:
main(): Uebung e= new Uebung();
List<City> all= e.getAllCities();

Gruß
 
Zuletzt bearbeitet:
C

Camino

Gast
Habe mir überlegt das jetzt so zu machen:

Ich habe die Klasse Uebung.

in der erstelle ich eine Liste:
public List<City> getAllCities();

Nachher erstelle ich mir dann eine neue Klasse "City" mit der main Methode:

Uebung e= new Uebung();
List<City> all= e.getAllCities();

Also die frage nun, wie das mit Listen geht?

Gruß

Na ja, du hast halt die Klasse City, welche Objekte mit Daten für jeweils 1 Stadt erzeugt. Diese fügst du dann in eine Liste ein:
Java:
City neueStadt1 = new City();
City neueStadt2 = new City();
...

List<City> cityList = new ArrayListy<City>();
cityList.add(neueStadt1);
cityList.add(neueStadt2);
...
 
C

Camino

Gast
Jetzt musst du nur noch bei der DB-Afrage das ResultSet durchgehen, jede gefundene Stadt als Objekt von City anlegen und der Liste hinzufügen.
 

pg1337

Bekanntes Mitglied
Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;


public class City {
	
	private static final String URL = "jdbc:postgresql://localhost:5432/mydb",
			USER = "postgres", PASSWORD = "XXX";
	
	Statement stmt= null;
	ResultSet rs= null;
	
	public City() {
		
	}
	
	private void getAllCities() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException
	{

		City stuttgart= new City();
		City muenchen= new City();
		City hamburg= new City();
		
		List<City> cityList= new ArrayList<City>();
		cityList.add(stuttgart);	
		cityList.add(muenchen);
		cityList.add(hamburg);
		
		Connection conn= getConnection();
		stmt= conn.createStatement();
		String query= "SELECT* FROM cities";
		rs= stmt.executeQuery(query);
	
	}

	private Connection getConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
		Class.forName("org.postgresql.Driver").newInstance();
		Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
		return conn;
	}
	
	
}

habe das jetzt soweit..?
 
Zuletzt bearbeitet:
C

Camino

Gast
Du brauchst erstmal eine Klasse City, welche die Städte aufnehmen kann, also grob so etwas:
Java:
public class City{

   // Felder (Name, Bevölkerungsanzahl und Fläche der Stadt)
   private String name;
   private int population;
   private double area;


   // Konstruktor
   public City( String name, int population, double area ) {

      this.name = name;
      this.population = population;
      this.area = area;

   }


   // dann noch getter- und setter-Methoden
   ...

}

Dann legst du die Städte so an:
Java:
City stuttgart = new City("Stuttgart", 500000, 17.5);

Oder du hast in der Klassee City einen leeren Konstruktor (ohne Parameter) und weist die Daten per setter-Methode dem Objekt zu.
 

pg1337

Bekanntes Mitglied
Du brauchst erstmal eine Klasse City, welche die Städte aufnehmen kann, also grob so etwas:
Java:
public class City{

   // Felder (Name, Bevölkerungsanzahl und Fläche der Stadt)
   private String name;
   private int population;
   private double area;


   // Konstruktor
   public City( String name, int population, double area ) {

      this.name = name;
      this.population = population;
      this.area = area;

   }



   // dann noch getter- und setter-Methoden
   ...

}

Dann legst du die Städte so an:
Java:
City stuttgart = new City("Stuttgart", 500000, 17.5);

Oder du hast in der Klassee City einen leeren Konstruktor (ohne Parameter) und weist die Daten per setter-Methode dem Objekt zu.

ah ok, gut dann vergiss meinen geänderten Beitrag schaue mir das so mal an :)
Aber da ist ja nun keine LIst mehr oder?
 
C

Camino

Gast
Du solltest dir erst nochmal die Grundlagen von Java anschauen, wie Klassen geschrieben und davon Objekte erzeugt werden.
 

pg1337

Bekanntes Mitglied
Bei deinem Vorschlag lege ich das dann ja über den Konstruktor an aber nichtmehr über die List<City> oder sehe ich das falsch?
 
C

Camino

Gast
ah ok, gut dann vergiss meinen geänderten Beitrag schaue mir das so mal an :)
Aber da ist ja nun keine LIst mehr oder?

Nein, das ist erstmal nur die Klasse City, welche die Städte darstellen soll, d.h. du hast dür jede Stadt ein Objekt dieser Klasse. Diese Objekte erzeugst du und kannst sie dann (wie oben beschrieben) in die Liste hinzufügen.
 
C

Camino

Gast
Bei deinem Vorschlag lege ich das dann ja über den Konstruktor an aber nichtmehr über die List<City> oder sehe ich das falsch?

Du könntest es auch so schreiben:
Java:
List<City> cityList = new ArrayListy<City>();
cityList.add(new City("Stuttgart", 500000, 17.5));
cityList.add(new City("München", 1200000, 23.87));
cityList.add(new City("Berlin", 3450000, 45.9));
...
 
Zuletzt bearbeitet von einem Moderator:

pg1337

Bekanntes Mitglied
Du könntest es auch so schreiben:
Java:
List<City> cityList = new ArrayListy<City>();
cityList.add(new City("Stuttgart", 500000, 17.5));
cityList.add(new City("München", 1200000, 23.87));
cityList.add(new City("Berlin", 3450000, 45.9));
...

Da erkennt es das .add nicht als Methode an :/ Schreibe es dann lieber anders

Eigentlich müsste es ja so gehen, kommt aber auch ein Fehler:

Java:
	List<City> cityList= new ArrayList<City>();
 	
 	City stuttgart = new City("Stuttgart", 500000, 17.5);
 	cityList.add(stuttgart);
 

pg1337

Bekanntes Mitglied
Ok jetzt hab ich s gefunden. Also in die Klasse City kommen nur die Attribute und Getter/ Setter rein.

Die Methode public List<City> getAllCities() muss ich natürlich in der Klasse Uebung definieren.. ich dödel.. deswegen hat es das nicht anerkannt.. sorry
 
C

Camino

Gast
Uups, da war ein Schreibfehler drin:
Java:
List<City> cityList = new ArrayListy<City>();
Muss ArrayList und nicht ArrayListy heissen...
Wenn du das so machst, solltest du aber auch die Klasse City haben, so wie ich es oben geschrieben hatte. Und dann musst du aber die Klasse, in welcher du die Liste anlegst, anders benennen. Die darf nicht auch City heissen.
 

pg1337

Bekanntes Mitglied
Uups, da war ein Schreibfehler drin:
Java:
List<City> cityList = new ArrayListy<City>();
Muss ArrayList und nicht ArrayListy heissen...
Wenn du das so machst, solltest du aber auch die Klasse City haben, so wie ich es oben geschrieben hatte. Und dann musst du aber die Klasse, in welcher du die Liste anlegst, anders benennen. Die darf nicht auch City heissen.

Ich poste das gleich mal wenn ichs fertig habe, für diejenigen die die selbe Frage haben. :)O 3 mal die theoretisch hintereinander:D ).

Dann kannst mal drüber schauen ob das so stimmt, muss mir nur mal kurz n Kaffee machen und eine rauchen gehen.:oops:
 

pg1337

Bekanntes Mitglied
Habe die Methode in der Klasse Uebung jetzt so gemacht:

Java:
 public List<City> getAllCities2() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException
   {
	   List<City> cityList= new ArrayList<City>();
	   Connection conn= getConnection();
	   stmt= conn.createStatement();
	   ResultSet result= stmt.executeQuery("SELECT* FROM cities");
	   
	   while(result.next()) {
		   City c= new City();
		   c.setName(result.getString("name"));
		   cityList.add(c);
	   }
	return cityList;
	   
   }

Wie gebe ich das jetzt in der Main methode mit System.out.println() aus?

Komplettes Programm sieht so aus jetzt:

Java:
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class Uebung{
	
	private static final String URL = "jdbc:postgresql://localhost:5432/mydb",
			USER = "postgres", PASSWORD = "123";
	
	Statement stmt= null;
	ResultSet rs= null;

 
   // Konstruktor
   public Uebung() {
 
 
   }
 
   // Methode für Datenbankverbindung
   private Connection getConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException 
   {	
			Class.forName("org.postgresql.Driver").newInstance();
			Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
			return conn;
   }
   
public List<City> getAllCities2() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException
   {
	   List<City> cityList= new ArrayList<City>();
	   Connection conn= getConnection();
	   stmt= conn.createStatement();
	   ResultSet result= stmt.executeQuery("SELECT* FROM cities");
	   
	   while(result.next()) {
		   City c= new City();
		   c.setName(result.getString("name"));
		   cityList.add(c);
	   }
	return cityList;
	   
   }
   
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
 
		
      // erzeugt ein Objekt der Klasse Uebung
      Uebung uebung= new Uebung();
      List<City> cityList= new ArrayList<City>();

 
   }
 
}


sowie die andere Klasse City:

Java:
import java.util.ArrayList;
import java.util.List;

public class City{

public City() {
	// TODO Auto-generated constructor stub
}


	// set-Methoden
	public void setName(String name){
		this.name= name; 
}
	
	public void setPopulation(int population){
		this.population= population;
	}
	
	
    public void setArea(double area){
    	this.area= area;
    }
    
 // get-Methoden
 	public String getName(){
 		return name;
 	}
 	
 	public int getPopulation(){
 		return population;
 	}
 	
 	public double getArea(){
 		return area;
 	}

}


Das Programm läuft, jetzt ist nur noch die Frage was bei der Klasse Uebung in System.out.println rein muss um die Sachen auszugeben.



Gruß :)
 

pg1337

Bekanntes Mitglied
Wenn ich das so schreibe:

Java:
System.out.println(getAllCities2());
gibt er mir das hier aus:

[City@18a61164, City@3ebfc8e0, City@211d0a4f, City@798fd984, City@5311a775, City@2c091cee, City@a4a63d8, City@19e0ff2f, City@29173ef, City@1b52513a]

Was ist daran falsch?
 

turtle

Top Contributor
In Zeile 50 einfügen
Java:
		for (City city : cityList) {
			System.out.println(city);			
		}
Eine "schöne" Ausgabe gibt es, wenn Du noch in der City-Klasse die toString() Methode überschreibst, zum Beispiel:
Java:
@Override
public String toString() {
	return "Name:""+name+" Einwohner:"+population+" Area:"+area);
}
 
C

Camino

Gast
Wenn ich das so schreibe:

Java:
System.out.println(getAllCities2());
gibt er mir das hier aus:

[City@18a61164, City@3ebfc8e0, City@211d0a4f, City@798fd984, City@5311a775, City@2c091cee, City@a4a63d8, City@19e0ff2f, City@29173ef, City@1b52513a]

Was ist daran falsch?
Das, was dir da ausgegeben wird, sind die City-Objekte, die in der Liste drinstehen. Du gibst ja auch die ganze Liste aus. Du musst natürlich noch durch die Liste durchgehen und dir die einzelnen City-Objekte ausgeben lassen. Entweder du hast in deiner City-Klasse eine toString-Methode, in der du angibst, was ausgegeben wird. Oder du gehst durch deine Liste durch und gibst für jedes Objekt das aus, was du davon brauchst (z.B. city.getName() ).
 

pg1337

Bekanntes Mitglied
Das soll ja mit einem Iterator gehen, wie funktioniert das?
Was muss ich wo rein schreiben?


Java:
   for (City city : cityList) {
           System.out.println(city.toString());
?
 
C

Camino

Gast
Lies doch mal, was turtle geschrieben hat...
Du musst das halt da hinschreiben, wo du deine Liste ausgeben möchtest.
Die for-Schleife ist schon so etwas wie ein Iterator. Du gehst durch die Liste durch und holst dir die City-Objekte.
 
Zuletzt bearbeitet von einem Moderator:

pg1337

Bekanntes Mitglied
Lies doch mal, was turtle geschrieben hat...

Hab ich drin.
In Uebung steht das bei der main:

Java:
   for (City city : cityList) {
           System.out.println(city.toString());

und in der City-Klasse das hier:

Java:
	@Override public String toString() {
 	    return "Name:" +name + "Einwohner:" +population+ " Area:"+area;
 	}

jetzt kommt jedoch gar keine Ausgabe mehr-
 

pg1337

Bekanntes Mitglied
jetzt komme ich langsam echt durcheinander -.-'

Wie geht das mit dem Iterator? Und wie Liste befüllen, das habe ich doch bei der Methode getAllCities2() mit der SQL Anweisung gemacht..
 

pg1337

Bekanntes Mitglied
Java:
  City uebung= new City();
	   List<City> cityList= new ArrayList<City>();
	   Uebung d = new Uebung();
	   cityList= d.getAllCities2();
		
		
	   for (City city : cityList) {
           System.out.println(city.toString());           
       }

So habs.. danke :)
 

pg1337

Bekanntes Mitglied
Vielen Dank euch dass ihr mir so geholfen habt!
Werde jetzt noch eine Methode findCityByName() machen und den Code hier posten :)

:applaus:
 

pg1337

Bekanntes Mitglied
So, also das hat dann doch nochmals ein Problem mehr gegeben.

Die Methode soll heißen: findCityByName(String name);

Wie mache ich das, mit nem Konstrukor oder was?
Soll ja nicht einfach nur ne SQL Anweisung sein, sondern n Objekt in der Main Methode wo man den Namen nur eingibt manuell und man dann alle Werte davon rauskriegt.

Gruß :)

Das habe ich bis jetzt, aber eben so will ich die Methode nicht haben :/

Java:
  public List<City> findCityByName() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
	   
	   List <City> cityList= new ArrayList<City>();
	   Connection conn= getConnection();
	   stmt= conn.createStatement();
	   ResultSet result= stmt.executeQuery("SELECT*FROM cities WHERE name='Stuttgart'");
	   
	   while(result.next()) {
		   City d= new City();
		   d.setName(result.getString("name"));
		   d.setArea(result.getInt("groesse"));
		   d.setPopulation(result.getInt("population"));
		   cityList.add(d);
	   }
	   
	return cityList;

p.s das sind keine Hausaufgaben.. bin aus der Schule schon draußen möchte mir Java nur gern selbst beibringen und das geht ohne Unterstützung leider nicht.
 
Zuletzt bearbeitet:

Neue Themen


Oben