# JDBC Methode in Datenbanken



## pg1337 (22. Nov 2011)

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:



```
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


----------



## Camino (22. Nov 2011)

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 (22. Nov 2011)

Camino hat gesagt.:


> 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:


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


Gruß


----------



## Camino (22. Nov 2011)

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 (22. Nov 2011)

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

ich schreibe jetzt:


```
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 (22. Nov 2011)

pg1337 hat gesagt.:


> puh also versuche es erstmal in der Main-Methode, verstehe das aber nicht ganz.
> 
> ich schreibe jetzt:
> 
> ...



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


----------



## Camino (22. Nov 2011)

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 (22. Nov 2011)

```
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?:/


----------



## Camino (22. Nov 2011)

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


----------



## Camino (22. Nov 2011)

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


```
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 (22. Nov 2011)

Camino hat gesagt.:


> Na ja, so grob würde es etwa so aussehen:
> 
> 
> ```
> ...




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!


----------



## Camino (22. Nov 2011)

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:


```
// 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 (22. Nov 2011)

```
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 (22. Nov 2011)

Jetzt habe ich glaube ich aber nicht die Methode :


```
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 (22. Nov 2011)

pg1337 hat gesagt.:


> Jetzt habe ich glaube ich aber nicht die Methode :
> 
> 
> ```
> ...





```
// 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


----------



## Camino (22. Nov 2011)

Ja, sieht schon besser aus... Du brauchst in deinen Methoden aber nicht mehr

```
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:

```
Connection conn = getConnection();
```
und dann mit diesem conn weiterarbeiten.


----------



## pg1337 (22. Nov 2011)

ok. danke


----------



## Camino (22. Nov 2011)

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).


----------



## Camino (22. Nov 2011)

pg1337 hat gesagt.:


> 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:
> ...



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 (22. Nov 2011)

Camino hat gesagt.:


> 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ß


----------



## Camino (22. Nov 2011)

pg1337 hat gesagt.:


> Habe mir überlegt das jetzt so zu machen:
> 
> Ich habe die Klasse Uebung.
> 
> ...



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:

```
City neueStadt1 = new City();
City neueStadt2 = new City();
...

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


----------



## Camino (22. Nov 2011)

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 (22. Nov 2011)

```
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..?


----------



## Camino (22. Nov 2011)

Du brauchst erstmal eine Klasse City, welche die Städte aufnehmen kann, also grob so etwas:

```
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:

```
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 (22. Nov 2011)

Camino hat gesagt.:


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



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


----------



## Camino (22. Nov 2011)

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


----------



## pg1337 (22. Nov 2011)

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


----------



## Camino (22. Nov 2011)

pg1337 hat gesagt.:


> 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.


----------



## Camino (22. Nov 2011)

pg1337 hat gesagt.:


> 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:

```
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));
...
```


----------



## pg1337 (22. Nov 2011)

Camino hat gesagt.:


> Du könntest es auch so schreiben:
> 
> ```
> List<City> cityList = new ArrayListy<City>();
> ...



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:


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


----------



## Camino (22. Nov 2011)

Welcher Fehler denn?


----------



## pg1337 (22. Nov 2011)

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


----------



## Camino (22. Nov 2011)

Uups, da war ein Schreibfehler drin:

```
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 (22. Nov 2011)

Camino hat gesagt.:


> Uups, da war ein Schreibfehler drin:
> 
> ```
> List<City> cityList = new ArrayListy<City>();
> ...



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

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


----------



## pg1337 (22. Nov 2011)

Habe die Methode in der Klasse Uebung jetzt so gemacht:


```
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:


```
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:


```
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 (22. Nov 2011)

Wenn ich das so schreibe:


```
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 (22. Nov 2011)

In Zeile 50 einfügen

```
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:

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


----------



## Camino (22. Nov 2011)

pg1337 hat gesagt.:


> Wenn ich das so schreibe:
> 
> 
> ```
> ...


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 (22. Nov 2011)

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



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


----------



## Camino (22. Nov 2011)

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.


----------



## pg1337 (22. Nov 2011)

Camino hat gesagt.:


> Lies doch mal, was turtle geschrieben hat...



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


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

und in der City-Klasse das hier:


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

jetzt kommt jedoch gar keine Ausgabe mehr-


----------



## Camino (22. Nov 2011)

pg1337 hat gesagt.:


> jetzt kommt jedoch gar keine Ausgabe mehr-



Hmm, ich rate mal: vielleicht weil die Liste leer ist? Musst du natürlich vorher auch mit Objekten gefüllt haben. Kannst du einfach testen, wenn du dir die Grösse der Liste ausgeben lässt (ich glaube size() war die Methode).


----------



## pg1337 (22. Nov 2011)

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 (22. Nov 2011)

```
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


----------



## Camino (22. Nov 2011)

Wozu ist das da:

```
City uebung= new City();
```


----------



## pg1337 (22. Nov 2011)

Camino hat gesagt.:


> Wozu ist das da:
> 
> ```
> City uebung= new City();
> ```



Das war noch von nem Versuch das hinzukriegen davor drin. habs rausgeschmissen


----------



## pg1337 (22. Nov 2011)

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

:applaus:


----------



## pg1337 (22. Nov 2011)

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 :/


```
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.


----------



## ARadauer (22. Nov 2011)

pg1337 hat gesagt.:


> jetzt komme ich langsam echt durcheinander -.-'



Wundert mich nicht, wenn du alle 2 Minuten was fragst und dir nicht mal 5 Minuten Zeit nimmst das zu lesen was hier geschrieben wird... Java ist nix was man nur durch herum probieren lernen kann


----------



## ARadauer (22. Nov 2011)

pg1337 hat gesagt.:


> Wie mache ich das, mit nem Konstrukor oder was?


Wie kommst du da drauf?


----------



## Camino (22. Nov 2011)

pg1337 hat gesagt.:


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


Da hast du es doch schon geschrieben. Du übergibst der Methode den Parameter name, also den NAmen der gesuchten Stadt. Diese Stringvariable setzt du dann in der SQL-Abfrage ein ("WHERE name = " + name).


----------



## pg1337 (22. Nov 2011)

```
public City findCityByName(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
	   
	  
	   Connection conn= getConnection();
	   stmt= conn.createStatement();
	   ResultSet result= stmt.executeQuery("SELECT*FROM cities WHERE name= '" + name + "'");
	   
	   while(result.next()) {
		   City d= new City();
		   d.setName(result.getString("name"));
		   d.setArea(result.getInt("groesse"));
		   d.setPopulation(result.getInt("population"));
		   
		   return d;
	   }
	   
        conn.close();
        return null;
}
```


So sieht die methode jetzt aus.

Wie gebe ich das in der Main dann aus?


```
Uebung e= new Uebung();
	   City stuttgart= e.findCityByName("Stuttgart");   for (City city : City) {
           System.out.println(city.toString());           
       }
```


----------



## Camino (22. Nov 2011)

pg1337 hat gesagt.:


> Wie gebe ich das in der Main dann aus?
> 
> 
> ```
> ...



Ich glaube, du hast das mit der for-Schleife noch nicht richtig verstanden.

```
for (City city : ArrayList<City>)
```

Das bedeutet, du hast eine Liste, in der sich City-Objekte befinden --> z.B. ArrayList<City> cityListe

Mit der for-Schleife gehst du diese Liste durch und bekommst dann in jedem Schleifendurchlauf das fortlaufende City-Objekt (City city) geliefert, auf das du dann in der Schleife zugreifen kannst.

Dein Problem ist jetzt, dass du in deiner Methode keine Liste erzeugst, sondern nur 1 City-Objekt, welches deine Methode als Rückgabewert hat. Es kommt also keine Liste sondern ein City-Objekt zurück.


```
City stuttgart= e.findCityByName("Stuttgart");
System.out.println(stuttgart.toString());
```


----------



## pg1337 (22. Nov 2011)

Camino hat gesagt.:


> Ich glaube, du hast das mit der for-Schleife noch nicht richtig verstanden.
> 
> ```
> for (City city : ArrayList<City>)
> ...



Ok, vielen dank.

Das Problem ist, dass ich mich erst seit kurzer zeit mit Java beschäftige, es aber so schnell es geht lernen muss um das Studentenniveau zu erreichen, Gründe dafür seien dahinter gestellt.

Ich habe jeden Tag 10h Zeit Java zu lernen, und da ist grade einfach soviel Info im Kopf dass er schon fast platzt.

Die Datenbanken waren jetzt schon ein ziemlich fortgeschrittenes Thema, habe mich zuvor mit anderen Sachen beschäftigt, mit GUI's etc.
Tut mir leid wenn euch das nerven gekostet hat, aber am Anfang geht das noch nicht so schnell. Beschäftige mich erst ein paar Wochen mit java..

Trotzdem danke dass ihr euch die Zeit genommen habt!
Gruß & einen schönen Abend noch 

p.s. wenn ihr gute Tutorials kennt (Videostreams) oder Andere Seiten(bitte kein galileo openbook) wäre es nett, wenn ihr mir diese per pn zuschicken könntet.


----------



## Camino (22. Nov 2011)

Deine Methode 
	
	
	
	





```
public City findCityByName(String name)
```
 ist so auch noch nicht richtig.
Was machst du, wenn es mehrere Datensätze mit "Stuttgart" als Name in der DB gibt? Du solltest 
	
	
	
	





```
City d = new City();
```
 ganz oben in die Methode verschieben und nicht in der Schleife das Objekt erzeugen. Und dann unten (nach close) nicht null sondern das Objekt d zurückgeben.


----------



## pg1337 (22. Nov 2011)

Camino hat gesagt.:


> Deine Methode
> 
> 
> 
> ...




das "return d" in der Schleife dann praktisch rausschmeißen?
ok gut das passt so. ja verstehe was du meinst habs noch nachträglich geändert danke


----------



## Camino (22. Nov 2011)

pg1337 hat gesagt.:


> das "return d" in der Schleife dann praktisch rausschmeißen?


Ja (bzw. das return d ganz zum Schluss), weil ein return einen Wert zurückgibt und dann der Rest der Methode nicht mehr weiter ausgeführt wird.

Nicht aufgeben! Java ist nicht ganz einfach. Man sollte auf jeden Fall besonders zum Beginn mal einen Blick in Bücher werfen und die Grundlagen (Klassen, Objekte, Methoden...) lernen.


----------



## pg1337 (22. Nov 2011)

Camino hat gesagt.:


> Ja (bzw. das return d ganz zum Schluss), weil ein return einen Wert zurückgibt und dann der Rest der Methode nicht mehr weiter ausgeführt wird.
> 
> Nicht aufgeben! Java ist nicht ganz einfach. Man sollte auf jeden Fall besonders zum Beginn mal einen Blick in Bücher werfen und die Grundlagen (Klassen, Objekte, Methoden...) lernen.




Hab ich nicht vor  Werde bestimmt noch öfters was in dem Forum fragen, war ja klasse wie schnell mir geholfen wurde! 

Habe schon 2 Bücher (Eddison Wesley verlag und das andere java von kopf bis fuß) relativ weiter durchgemacht, nur mich hat das bei JDBC alles ein bisschen verwirrt.. am besten erstmal ne Nacht drüber schlafen. Also vielen Dank dir nochmal!

Gruß


----------



## Camino (22. Nov 2011)

Ja, eine Nacht drüber schlafen hat mir auch schon manchmal geholfen... ;-) Aber wie auch schon gesagt: einige deiner Probleme hatten nichts direkt mit JDBC zu tun, sondern waren grundsätzliche Fehler. Es ist halt auch schwer, gleich mit JDBC anzufangen, wenn zum Teil noch Java-Grundlagen fehlen. Also, speziell wie Klassen, Objekte und Methoden strukturiert sind und funktionieren. Oder das Arbeiten mit Collections. Das solltest du dir auf jeden Fall noch aneignen, dann klappt es auch mit JDBC besser und macht mehr Spass.


----------



## pg1337 (23. Nov 2011)

ja.. ich gehe das alles nochmal durch heute und den rest der woche


----------



## pg1337 (23. Nov 2011)

So ich bins nochmals.

Nun habe ich 2 Tabellen in meiner Datenbank.

Einmal die Tabelle cities, in welcher Name, population & area der Städte gespeichert sind.
Die andere Tabelle heißt land. In Ihr stehen die länder drin (name, population).

Zusätzlich habe ich jetzt eine country_id angelegt, sprich:

in beiden Tabellen ist eine neue Spalte id dazu gekommen.
Das sieht folgendermaßen aus:

id 1 --> Deutschland --> 80 mio
id2 - -> USA --> 315 mio
etc.


Nun möchte ich in einer dritten Klasse Country alle Städte in einer Liste speichern und dann Städte in der main von Uebung ausgeben lassen, die zum Beispiel in Deutschland liegen(aber in der anderen Tabelle gespeichert sind) mit der Methode ...public Country getCountryByName(String name).


Meine Frage: Wie kann ich da jetzt die Verbindung zwischen den beiden Tabellen herstellen, dass wenn ich Deutschland als Name vorgebe in der main methode in der anderen Tabelle geschaut wird, welche Städte zu Deutschland gehören (Also die id=1 haben) und diese dann ausgeben lasse.


Gruß & danke schonmals.


----------



## Camino (23. Nov 2011)

Schau mal hier: Tabellenausdrücke
Da steht was zu PostgreSQL und wie man Tabellen verbindet. Das wird also normalerweise mit SQL und nicht mit Java gelöst.


----------



## pg1337 (23. Nov 2011)

Danke dafür- hatte heut n anstrengenden Tag werde mich der Sache morgen früh widmen- trotzdem danke dass du so schnell geantwortet hast


----------



## pg1337 (24. Nov 2011)

So in ordnung?


```
public List<City> getCountryByName(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
	   
	   List<City> cityList= new ArrayList<City>();
	   Connection conn= getConnection();
	   stmt= conn.createStatement();
	   String query1= "SELECT*FROM land WHERE name= '" + name + "'";
	   ResultSet rst= stmt.executeQuery(query1);
	   
	   while(rst.next()) {
		   City b= new City();
		   b.setName(rst.getString("name"));
		   b.setPopulation(rst.getInt("population"));
		   cityList.add(b);
	   }
	   
	   String query= "SELECT*FROM cities c , land l WHERE l.id=c.country_id AND l.name= '" + name + "'";
	   ResultSet result= stmt.executeQuery(query);
	   
	   while(result.next()) {
		   City c= new City();
		   c.setName(result.getString("name"));
		   c.setPopulation(result.getInt("population"));
		   cityList.add(c);
	   }
	   conn.close();
	   return cityList;
   }
```

Gruß


----------



## pg1337 (24. Nov 2011)

```
public Country getCountryByName(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
	   
	   
	   Connection conn= getConnection();
	   stmt= conn.createStatement();
	   String query1= "SELECT*FROM land WHERE name= '" + name + "'";
	   ResultSet rst= stmt.executeQuery(query1);
	   Country country= new Country();
	   
	   while(rst.next()) {
		   
		   City b= new City();
		   b.setName(rst.getString("name"));
		   b.setPopulation(rst.getInt("population"));
		   country.getCityList().add(b);
	   }
	   
	   String query= "SELECT*FROM cities c , land l WHERE l.id=c.country_id AND l.name= '" + name + "'";
	   ResultSet result= stmt.executeQuery(query);
	   
	   while(result.next()) {
		   City c= new City();
		   c.setName(result.getString("name").trim()); // trim sonst große Lücke
		   c.setPopulation(result.getInt("population"));
		   country.getCityList().add(c); //country objekt auf cityList zugreifen 
	   }
	   conn.close();
	   return country;
   }
```


Hab die methode jetzt so umgeschrieben.


----------

