Methode createStatement()

Wang

Bekanntes Mitglied
Hallo allerseits,

mir lässt leider die Methode createStatement() keine Ruhe (stammt aus einem Beispiel im Buch "Java als erste Programmiersprache"):

Java:
// Verbindung zum DBMC herstellen. Es wird nun implizit
// der JDBC-Treiber com.mysql.jdbc.Driver geladen.
// Der Aufruf liefert ein Objekt vom Typ Connection zurück,
// das die Verbindung zum DBMS kapselt.
Connection con = DriverManager.getConnection (url + dbName, user, passwd);

// Der Aufruf der Methode createStatement() auf dem
// Connection-Obejkt liefert ein Objekt vom Typ
// Statement zurück. Über dieses Objekt können SQL-
// Befehle an die Datenbank gesendet werden.
Statement stmt = con.createStatement();

Die Methode createStatement() stammt aus dem Interface Connection und besitzt damit keinen Rumpf. Wie ist es aber möglich, dass sie dennoch ein Objekt zurückgibt? ???:L

Thanks!

Gruß
Wang
 

Michael...

Top Contributor
Die Methode createStatement() stammt aus dem Interface Connection und besitzt damit keinen Rumpf. Wie ist es aber möglich, dass sie dennoch ein Objekt zurückgibt? ???:L
Die Methode ist ja in dem entsprechenden Datenbanktreiber implementiert bzw. in dem Connection Objekt welches von DriverManager.getConnection(...) zurückgegeben wird.
 
S

SlaterB

Gast
sind dir Collections bekannt?

List x = ..;
x.get();

wie kann das 'leere' Interface List eine Methode get() haben?
analoge Frage
 

Wang

Bekanntes Mitglied
Polymorphismus und Collections sind mir bekannt. ;)
So etwas wie
Code:
List<String> x = new ArrayList<String>();
ist mir also klar.

Anscheinend wird createStatement() im Connector/J (MySQL :: Download Connector/J) implementiert.

Bisher habe ich aber noch nicht rausgefunden wo genau das geschieht...


EDIT:
Scheinbar passiert es im package com.mysql.jdbc.jdbc2.optional in der Klasse ConnectionWrapper.
 
Zuletzt bearbeitet:

Wang

Bekanntes Mitglied
Jetzt habe ich doch noch eine Frage, da einem das teilweise "magisch" vorkommt:
Sehe ich das richtig, dass der Klassenlader hier im entsprechenden Pfad solange sucht, bis er die implementierte Methode createStatement() in der Klasse "ConnectionWrapper" findet?

Anders kann ich es mir zumindest nicht erklären...

Thanks!
 

Wang

Bekanntes Mitglied
Obwohl ich weiß, wo createStatement() implementiert ist, sehe ich nicht, wie der Bezug zu dieser implementierten Methode hergestellt wird. :(

Das was SlaterB angesprochen hat, ist mir aber absolut klar.
 
M

maki

Gast
Verstehe dein Problem ehrlich gesagt nicht, kommt mir alles wie reine Zeitverschwendung vor.

Die Methode createStatement wird von der implementierenden Klasse ConnectionImpl implementiert, steht auch ziemlich offensichtlich in den Sourcen.
 

XHelp

Top Contributor
Dann musst du eben dir die Sourcen von DriverManager angucken... aber so ganz verstanden was du willst, habe ich dennoch nicht.
 

Wang

Bekanntes Mitglied
Sorry, dass mein Problem nicht deutlich wird (Zeitverschwendung - naja, ich weiß wie man die Klassen anwendet und ich könnte an dieser Stelle "egal" sagen, aber ich möchte dennoch möchte über die Hintergründe Bescheid wissen ;) ).

Wir hatten:

Java:
Connection con = DriverManager.getConnection (url + dbName, user, passwd);

Das ist mir absolut klar.

Dann:

Java:
Statement stmt = con.createStatement();

An dieser Stelle möchte ich nochmals das Beispiel von SlaterB aufgreifen:

Java:
List<String> x = new ArrayList<String>();
x.get();

Im Interface List gibt es die Methode get(), welche dann u.a. in der Klasse ArrayList implementiert wird. Da ArrayList das Interface List implementiert, klappt auch der Aufruf x.get();.

Ich sehe aber nicht, warum
Code:
Statement stmt = con.createStatement();
funktioniert?
 
M

maki

Gast
Im Interface List gibt es die Methode get(), welche dann u.a. in der Klasse ArrayList implementiert wird. Da ArrayList das Interface List implementiert, klappt auch der Aufruf x.get();.

Ich sehe aber nicht, warum Statement stmt = con.createStatement(); funktioniert?
Habe ich doch bereits beschrieben, ConnectionImpl implementiert Connection, also genau analog....
 

XHelp

Top Contributor
Ok, ein anderes List, beispiel, vlt wird es ja deutlicher:
Java:
public class ArrayDriver {
  public static List<String> getList(String url) {
    List<String> result = new ArrayList<String>();
    result.add(url);
    return result;
  }
}
...
public class Tester {
  public static void main(String[] args) {
    //Connection con = DriverManager.getConnection (url + dbName, user, passwd);
    List<String> con = ArrayDriver.getList("hm");

    //Statement stmt = con.createStatement();
    String s = con.get(0);
  }
}
 

Michael...

Top Contributor
Jetzt habe ich doch noch eine Frage, da einem das teilweise "magisch" vorkommt:
Sehe ich das richtig, dass der Klassenlader hier im entsprechenden Pfad solange sucht, bis er die implementierte Methode createStatement() in der Klasse "ConnectionWrapper" findet?
Nein, der Anwender registriert indirekt die Treiberklasse bzw. eine Instanz des Datenbanktreibers beim DriverManager:
Vor dem Aufbau einer Datenbankverbindung muss ja die Treiberklasse geladen werden
Code:
Class.forName("com.mysql.jdbc.Driver")
Dabei muss der Treiber so implementiert sein, dass er sich am DriverManager registriert, d.h. der DriverManager enthält dann eine Liste potentieller Treiberklassen/instanzen (In der Regel mit nur einem Eintrag). Wird eine Connection angefordert probiert der DriverManager die ihm bekannten Treiber der Reihe nach durch und liefert im Erfolgsfall eine Datenbankverbindung zurück.
 

oopexpert

Mitglied
ConnectionImpl implements Connection
Connection defines "Statement createStatement()"
Daraus folgt: ConnectionImpl muss "Statement createStatement()" implementieren.
Warum du ein Objekt vom Typ Statement zurückbekommst, liegt daran, dass ConnectionImpl ein neues erzeugt...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
S Variable in main soll mit der generierten Zahl aus einer Methode ausgefüllt werden Datenbankprogrammierung 3
D sql query in methode mit rückgabetyp Datenbankprogrammierung 14
D JPA gleiche methode funktioniert an einer Stelle, an der anderen nicht Datenbankprogrammierung 3
C Seitensystem mit seek Methode Datenbankprogrammierung 2
D Insert Methode per Servlet Datenbankprogrammierung 2
D Insert Methode per Servlet Datenbankprogrammierung 0
J Datenbank: Methode wegen doppelten User Datenbankprogrammierung 1
N tableChanged Methode - AbstractTableModel Datenbankprogrammierung 2
S Hibernate und Set-Methode Datenbankprogrammierung 16
S Schnellste Methode Datei aus Datenbank herstellen Datenbankprogrammierung 7
A update methode für datenbank Datenbankprogrammierung 2
A Insert Methode Syntaxfehler Datenbankprogrammierung 2
J Methode Datenbankprogrammierung 5
R Effiziente Java-Methode zum finden eines freien PK Datenbankprogrammierung 7
K Schnelle Methode um zu testen ob Datensatz existiert Datenbankprogrammierung 9
G Effektive Methode zum durchsuchen von SQL-Datenbanken Datenbankprogrammierung 7
A Problem mit der Methode setFieldDelimiter("'"); Datenbankprogrammierung 3
L Methode, die Veränderungen in Datenbank zeigt? Datenbankprogrammierung 4
T Methode getColumnIndex(String columnName) ? Datenbankprogrammierung 6
A Blob in Oracle-DB einfügen (veraltete Methode) Datenbankprogrammierung 3
B Methode .next() - das Rätsel für Experten! URGENT Datenbankprogrammierung 2
G SQL-Query Methode Datenbankprogrammierung 4
B createStatement vs. prepareStatement Datenbankprogrammierung 3
J CreateStatement() Datenbankprogrammierung 4
G Wo ist hier der Fehler (createStatement) Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben