JDBC

D

DBFrager77

Gast
Guten Tag liebes Forum,

Frage 1:
Weshalb kann die Methode nicht auf die return-Anweisung zugreifen?

Ohne Try/Catch-Block funktioniert es ohne Probleme.

Java:
private static Connection getSQLConnection() 
	{
		try{
		 //Driver which connects Java with SQL-Database
		String driverName = "com.mysql.jdbc.Driver";
		Class.forName(driverName);
		
		//Getting Connection
		String url = "jdbc:mysql://127.0.0.1:3306/Studienarbeit";
		return DriverManager.getConnection(url, "root","init");
		}
		catch(Exception e)
		{
			
		}
	}

Fehlermeldung: This method must return a result of type Connection


Meine zweite Frage bezieht sich auf den ausführenden Teil meines Programms:

Java:
public static void main(String[] args) throws Exception { 
		
		Connection con = getSQLConnection();
		Statement st = con.createStatement();
		st.executeUpdate("insert into person (name,plz,ort) values ('Peter','85909','Florida')");
		st.executeUpdate("insert into person (name,plz,ort) values ('Richard', '54890', 'St. Value')");
		
		
		//Interrogation Command for the Database
		st = con.createStatement();
		ResultSet rs = st.executeQuery("Select * from Person");
		
		//Counts all columns of the Database including the new ones
		ResultSetMetaData rsMetaData = rs.getMetaData();
		int numberOfColumns = rsMetaData.getColumnCount();
		
		System.out.println("------------------------------------");
		System.out.println("ResultSet MetaData column Count = " + numberOfColumns);
		System.out.println("------------------------------------");
		
		//Prints the new Database
		while(rs.next())
		{
			System.out.println(rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));
		}
		
		//Cleaning up
		rs.close();
		st.close();
		con.close();

	}

}

Die Ausgabe ergibt

------------------------------------
ResultSet MetaData column Count = 4
------------------------------------
1 Paul 85221
2 Gamby 80089
3 Bambi 1294
4 Peter 85909
5 Richard 54890
6 Peter 85909
7 Richard 54890
8 Peter 85909
9 Richard 54890
10 Peter 85909
11 Richard 54890
12 Peter 85909
13 Richard 54890
14 Peter 85909
15 Richard 54890
16 Peter 85909
17 Richard 54890
18 Peter 85909
19 Richard 54890
20 Peter 85909
21 Richard 54890
22 Peter 85909
23 Richard 54890
24 Peter 85909
25 Richard 54890
26 Peter 85909
27 Richard 54890
28 Peter 85909
29 Richard 54890


Jedes mal wenn ich die Application ausführe, werden die insert-Anweisungen nochmal ausgeführt, obwohl diese nicht in einer Schleife sind.

Kann mir jemand erklären warum das so ist und wie ich es am Besten beheben kann?

PS: Für mich ist das Gebiet JDBC ein neues Gebiet, also bitte anfängerfreundlich erklären.
PPS: Ja, die Postleitzahlen sind nicht richtig, ich bin mir dessen bewusst.

mfG
Und danke schon einmal im Voraus.
 

ARadauer

Top Contributor
Java:
private static Connection getSQLConnection() 
    {
        try{
        String driverName = "com.mysql.jdbc.Driver";
        Class.forName(driverName); //wenn hier ein fehler passiert
        String url = "jdbc:mysql://127.0.0.1:3306/Studienarbeit";
        return DriverManager.getConnection(url, "root","init");
        }
        catch(Exception e)
        {
         //gehts hier weiter... nie leere catch blöcke!!!!!!            
        }
        //so und jetzt, was gibst du zurück?, nix... du musst aber was zurück liefern
       zb return null;

    }

Jedes mal wenn ich die Application ausführe, werden die insert-Anweisungen nochmal ausgeführt, obwohl diese nicht in einer Schleife sind.
ja was soll den passieren? warum sollte er sie nicht ausführen?
 

turtle

Top Contributor
Weshalb kann die Methode nicht auf die return-Anweisung zugreifen?
Weil die Methode nichts zurückliefert wenn der Exception-Zweig durchlaufen wird.
Jedes mal wenn ich die Application ausführe, werden die insert-Anweisungen nochmal ausgeführt, obwohl diese nicht in einer Schleife sind
Du fügst die Einträge doch immer wieder ein!
Code:
       st.executeUpdate("insert into person (name,plz,ort) values ('Peter','85909','Florida')");
        st.executeUpdate("insert into person (name,plz,ort) values ('Richard', '54890', 'St. Value')");
 
D

DBFrager77

Gast
Ok danke für die Antworten.

@aradauer
Wenn ich aber die return Anweisung hinter die catch-Blöche schreibe, ist sie nicht mehr im Try-Block und somit wird meine String-variable "url" nicht mehr erreicht.

Deswegen muss mein return irgendwie in den Try block. Würde sich da ein geschachtelter try/ctach-block empfehlen?



@turtle
ja ich weiß, ich füge die daten ein, aber heißt das, ich muss mein programm jedesmal abändern, sobald ich die daten eingefügt habe?

dann muss ich doch jedes mal den code abändern?
 

pl4gu33

Top Contributor
bei ARadauers Lösung hast du ja 2 return, deine Connection und ein return null .... das is wichtig falls das return nicht in dem Try Block erreicht wird und eine Exception geschmissen wird dann gibt die Methode null zurück.

und vergiss net in den Catch Block was einzutragen sonst bringt der dir gar nix :D
 
Zuletzt bearbeitet:

turtle

Top Contributor
ja ich weiß, ich füge die daten ein, aber heißt das, ich muss mein programm jedesmal abändern, sobald ich die daten eingefügt habe?

dann muss ich doch jedes mal den code abändern?

:bahnhof: Ich verstehe Dich nicht. Du weisst schon, das eine DB die Daten auch nach Abschalten behält, oder? Damit sind die eingefügten Daten persistent in der DB gespeichert!

Ich halte das "Vergraben" von SQL-Anweisungen in Java-Code generell für schlecht. Diese sollte man möglichst aus Java-Dateien raushalten und in externer Form speichern (bei myBATIS beispielsweise in XML oder durch Angabe des SQL-Dialektes der Datenbank). So kann man den Zugriff auf zum Beispiel eine andere Datenbank durchführen ohne Code ändern zu müssen.

Beim Anschauen des Codes ist mir noch aufgefallen, dass der Vorschlag, wenn da beim Aufbau der Verbindung etwas schief geht, Null zurück zu liefern, ich persönlich für unglücklich halte. Dieses ist ein Beispiel wo man eine eigene Exception-Klasse entwickeln sollte. Mein Beispiel wirft jetzt zur Anschauung "nur" eine IllegalArgumentException. Aber Java erkennt, dass entweder eine gültige Connection geliefert oder eine Exception geworfen wird. Der Null-Fall gibt Verwantwortung an den Aufrufer zurück, dass dieser prüfen muss, ob die Verbindung valid ist. Mein Code knallt sofort und beendet die Applikation mit eine Stacktrace, was ich für einen Vorteil find ;).
IllegalArgumentException muss noch nicht einmal in der Signatur auftauchen weil es eine RunTimeException ist. Aber das kann ja bei der eigenen Exception-Hierarchie gemacht werden wie Du möchtest.

Und wie schon angedeutet sollte NIEMALS nicht, Never ein leerer Exception-Block geschrieben werden!!! Und Du solltest auch darauf verzichten Exception zu fangen, wenn es "nur" ClassNotFound oder SQLException sein können. Hier sind ein paar Hinweise dazu zu finden.

Java:
	public static Connection getConnection(){
			try {
				// Driver which connects Java with SQL-Database
				String driverName = "com.mysql.jdbc.Driver";
				Class.forName(driverName);

				// Getting Connection
				String url = "jdbc:mysql://127.0.0.1:3306/Studienarbeit";
				return DriverManager.getConnection(url, "root", "init");
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			throw new IllegalArgumentException("Could not establish conncetion");
	}
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
aber heißt das, ich muss mein programm jedesmal abändern, sobald ich die daten eingefügt habe?
???:L ???:L ???:L du schreibst ein programm das daten einfügt... jetzt willst du dass keine daten mehr eingefügt werden... ähmn ja dann musst du es ändern... du kannst natürlich auch einenparamter mitgeben und auf den überprüfen... oder du kannst vorher lesen und schaun ob schon was da ist und dann erst schreiben...
 

HimBromBeere

Top Contributor
Ohne Try/Catch-Block funktioniert es ohne Probleme.
Also wenn dir deine IDE schon anbietet, Exceptions automatisch zu fangen, dann solltest du das auch nutzen und zwar so detailiert wie möglich (Vgl. Beitrag von turtle). In deinem Fall also die bereits erwähnte ClassNotFoundException und die SQLException.
 
D

DBFrager77

Gast
Ok danke für die Antworten, werde es mir merken!

PS: Sorry für die verspätete Antwort, hatte Inet probs -.-
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe JDBC Connector von Maven Repo importieren Allgemeine Java-Themen 1
O Zugriff auf mySQL ohne JDBC Allgemeine Java-Themen 3
V Maven Maven ClassNotFoundException MySQL JDBC Treiber Allgemeine Java-Themen 1
M JDBC DATE 0000-00-00 kann nicht ausgegeben werden Allgemeine Java-Themen 3
I Performance - JDBC UPC PoolDataSoure Allgemeine Java-Themen 0
K Classpath JDBC Driver auf Server Allgemeine Java-Themen 4
F Alternative sun.jdbc.odbc.JdbcOdbcDriver (Access Datenbank) Allgemeine Java-Themen 2
A Classpath programm findet jdbc nicht Allgemeine Java-Themen 4
M Junit und Mocks bei JDBC Daos Allgemeine Java-Themen 8
M jdbc treiber (h2) mit eigenem ClassLoader laden Allgemeine Java-Themen 4
G Große Datenmengen per JDBC Allgemeine Java-Themen 5
G JDBC Programm und niedrige Java-Versionen Allgemeine Java-Themen 14
G Text aus Zwischenablage in JTextarea -> JDBC Error Allgemeine Java-Themen 3
H Sekunden messen wie lange h.ibernate/jdbc abfragen brauchen Allgemeine Java-Themen 7
T JDBC: Unterschiede in Interfaces zwischen 2 Java-Versionen. Allgemeine Java-Themen 6
L JDBC Erklärung zu einer Java Anwendung Allgemeine Java-Themen 2
märliprinz com.sap.dbtech.jdbc.exceptions.JDBCDriverException Allgemeine Java-Themen 2
C ClassLoader - dymisches Laden von JDBC Drivers Allgemeine Java-Themen 3
V gezielte Datenbankeinträge über JDBC schnittstelle Allgemeine Java-Themen 10
M JDBC Class not found Allgemeine Java-Themen 2
Fredy JDBC: character Werte aus Tabellenspalten holen?? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben