JDBC modular

Status
Nicht offen für weitere Antworten.

allievo

Mitglied
Hi,

um die Gemüter gleich zu beruhigen - ich habe kein Problem mit JDBC Zugriffen :wink: den Zugriff bekomme ich hin.
Da ich allerdings kaum Programmiererfahrung habe, weiß ich nicht, wie ich in einem Progrämmchen den Zugriff auf Datenbanken so modular wie möglich gestalte. Sprich, dass es meinem Programm als solches egal ist ob ich auf eine Access, MySQL oder PostgressQL Datenbank zugreife.
Mein bisheriges Werk habe ich zur Erläuterung mal angehängt ...

Code:
public class Hauptklasse {
  public static void main(String[] args) {
    DBConnect db = new DBConnect("ODBCName","user", "password");
    db.setSQL("SELECT * FROM tabelle1;");
    db.getDaten();
    db.closeAll();
  }
}


Code:
import java.sql.*;

public class DBConnect {
    
    private final String url = "jdbc:odbc:";
    private String dbname;
    private final String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
    
    private String user;
    private String pwd;    
    private String sql;
    
    private Connection con;
    private Statement stmt;
    private ResultSet result;

    public DBConnect() {
    }
    
    public DBConnect(String dbname, String user, String pwd) {
        
        try {
            Class.forName(driver);
            con = DriverManager.getConnection(url+dbname,user,pwd);
            System.out.println("Verbinde mit " + dbname + " ...");
        }
        catch(SQLException e) {
            System.out.println("Fehler beim Verbindungsaufbau!");
            System.exit(0);
        }
        catch (ClassNotFoundException e) {
            System.out.println("JDBC over ODBC Treiber nicht gefunden!");
            System.exit(0);
        }
        
        System.out.println("Verbindungsaufbau erfolgreich\n");
    }
    
    public void setSQL(String sql) {
        this.sql = sql;
    }
    
    public String getDaten() {
        
        try {
            stmt = con.createStatement();
            result = stmt.executeQuery(sql);
            while (result.next()) {
                ...
                ...
                ...
            }
        }
        catch(SQLException e) {
            System.out.println("Fehler bei der Ausgabe!" + e);
            System.exit(0);
        }
        return "";
    }
        
    public void closeAll() {
        try {
            result.close();
            stmt.close();
            con.close();
            System.out.println("\n\nResultSet und Statement wurden erfolgreich geschlossen!");
        }
        catch(SQLException e) {
            System.out.println("Fehler im close()-Argument!" + e);
            System.exit(0);
        }
    }
}

Würde jetzt gerne mal wissen wie Ihr das angestellt hättet. Mir bleibt es ja grundsätzlich selbst überlassen ob ich bspw. eine getDaten() in der gleichen Klasse beherberge, doch im Hinblick auf die Modularität wäre es doch sinnvoller die ganzen getterMethoden (falls es jetzt mehrere davon gäbe) in eine andere Klasse zu verschieben? Vielleicht sogar die DBConnect als abstrakt definieren und die extra Klasse als Unterklasse der abstrakten DBConnect definieren?
Oder gar einen ganzen anderen Ansatz, dass man die getterMethoden direkt in die Klassen einfügt, aus denen sie benötigt werden???
Also Ihr seht schon - kann mich unter tausenden von Variatonen nicht entscheiden. Vielleicht könnt Ihr mir auf die Sprünge helfen und mir verraten was in der Praxis häufig Anwendung findet.

Grüße
Allievo
 

foobar

Top Contributor
Du mußt den Namen des Treibers auch noch mit an die Klasse DbConnect übergeben. Ausserdem sollte die Klasse ein Interface implementieren, daß eine Methode
Code:
public Connection getConnection();
beinhaltet. Dann hast du den Datenbankzugriff besser gekapselt, denn alles was die anderen Klassen Interessiert ist die Connection. Wo die Connection herkommt und auf welche Db diese ZUgreift spielt keine Rolle.

Ansonsten guck dir mal die Pattern DAO und Factory an.
 

Bleiglanz

Gesperrter Benutzer
mein senf dazu
Code:
import java.sql.*;

public class DBConnect {
    
    private final String url = "jdbc:odbc:";
    private String dbname;
    private final String driver = "sun.jdbc.odbc.JdbcOdbcDriver";  
    
    private String user; // sollte final sein
    private String pwd; // sollte final sein   
    private String sql;
    
    private Connection con;  // sollte final sein  
    private Statement stmt;  // 
    private ResultSet result;  // 

    public DBConnect() {
    }
    
    public DBConnect(String dbname, String user, String pwd) {
        
        try {
            Class.forName(driver);
            con = DriverManager.getConnection(url+dbname,user,pwd);
            System.out.println("Verbinde mit " + dbname + " ...");
        }
        catch(SQLException e) {
            System.out.println("Fehler beim Verbindungsaufbau!"+e);
            System.exit(0); // TOTALER MIST, VERZICHTE AUF SYSTEM.EXIT!
        }
        catch (ClassNotFoundException e) {  // FALSCHE REIHENFOLGE, KOMMT DIE NICHT VOR DER SQLException?
            System.out.println("JDBC over ODBC Treiber nicht gefunden!"+e);
            System.exit(0); // TOTALER MIST, VERZICHTE AUF SYSTEM.EXIT!
        }
        // SEHR SCHLECHT GEMACHT! WAS SOLL DIE AUSGABE AUF DIE KONSOLE?
        // WENN DIE NICHT "SICHTBAR" IST, WAS DANN - DER KONSTRUKTOR
        // KEHRT NORMAL ZURÜCK OBWOHL con=null usw.
        System.out.println("Verbindungsaufbau erfolgreich\n");
    }
    
    public void setSQL(String newSql) {
        this.sql = newSql;
    }
    
    public String getDaten() {
        
        try {
            stmt = con.createStatement();
            result = stmt.executeQuery(sql);
            while (result.next()) {
                ...
                ...
                ...
            }
        }
        catch(SQLException e) {
            System.out.println("Fehler bei der Ausgabe!" + e);
            System.exit(0); // TOTALER MIST, VERZICHTE AUF SYSTEM.EXIT!
        }
        return ""; // hä? Was soll da zurückkommen??
        // wie soll das überhaupt realisiert werden? Man übergibt einen
        // sql String ung bekommt einen Zurück? Welchen????
    }
        
    public void closeAll() {
        try {
            result.close(); // ACHTUNG: Wenn hier ein Fehler, wird con.close() nicht mehr aufgerufen!!!!
            stmt.close();
            con.close();
            System.out.println("\n\nResultSet und Statement wurden erfolgreich geschlossen!");
        }
        catch(SQLException e) {
            System.out.println("Fehler im close()-Argument!" + e); // was ist ein "close()-Argument"
            System.exit(0); // TOTALER MIST, VERZICHTE AUF SYSTEM.EXIT!
        }
    }
}
[/quote]
toll gemacht, dein Programm "verschluckt" wirklich alle Ausnahmen!

warum willst du dein Programm gleich beenden, wenn eine ex auftaucht? Kopfschüttel

wie soll getDaten denn funktionieren (Ergebnis eines SQL-Befehls als String)? Kopfschüttel

generell zwingst du den Client, closeAll aufzurufen (was, wenn er das vergisst?) - finde ich
nicht so gut (was passiert wenn er danach nochmal getDaten aufruft?)

BTW: warum gibts this.sql als private member - könnten doch genausogut
als Paramter für getDaten herhalten?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A JDBC EmbeddedDriver Java Basics - Anfänger-Themen 1
C No suitable driver found for jdbc:odbc:mysql Java Basics - Anfänger-Themen 8
D JDBC wie ermittle ich den Driver? Java Basics - Anfänger-Themen 26
A Java - JDBC SQL Java Basics - Anfänger-Themen 2
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
B MySQL (jdbc) -> connection liefert NULL Java Basics - Anfänger-Themen 3
F Warum erhalte ich diese Fehler bei der Einbindung von SQLite JDBC in Eclipse? Java Basics - Anfänger-Themen 1
Vince42 Java 8 JDBC / OLE DB Java Basics - Anfänger-Themen 15
O JDBC Ungültiger Spaltenindex Java Basics - Anfänger-Themen 19
K JDBC - Wie ist Fehlermeldung zu interpretieren Java Basics - Anfänger-Themen 3
B Java Datenbankverbindungsfähigkeit - JDBC Java Basics - Anfänger-Themen 1
D Was genau ist JDBC? Java Basics - Anfänger-Themen 2
P Classpath jdbc-Treiber kann nach export in jar-File nicht mehr geladen werden Java Basics - Anfänger-Themen 2
M JDBC SQL Problem Java Basics - Anfänger-Themen 5
K org.h2.jdbc.JdbcSQLException: Keine Daten verfügbar Java Basics - Anfänger-Themen 9
J Oracle JDBC Driver funktioniert nur in einer Klasse Java Basics - Anfänger-Themen 2
eLogic JDBC: Relative Pfadangabe in JAR Java Basics - Anfänger-Themen 14
F Erfassung von PCs in eine SQLite-Datenbank über JDBC Java Basics - Anfänger-Themen 9
S JDBC MySQL Connector - Element mit ' eintragen? Java Basics - Anfänger-Themen 4
D JDBC Datenbank fail?! Java Basics - Anfänger-Themen 20
R JDBC leeres ResultSet Problem Java Basics - Anfänger-Themen 2
J Java JDBC MySQL Query Java Basics - Anfänger-Themen 6
X JDBC installieren Java Basics - Anfänger-Themen 2
F JDBC - ClassNotFoundException Java Basics - Anfänger-Themen 3
J jdbc driver on linux ? Java Basics - Anfänger-Themen 11
lenniii DB Basics (JDBC-Treiber) Java Basics - Anfänger-Themen 16
P Servlets und JDBC Java Basics - Anfänger-Themen 2
B JDBC DB2 Connection Java Basics - Anfänger-Themen 1
C OOP JDBC: Ausgabe ResultSet nach Select Java Basics - Anfänger-Themen 3
P JDBC für anfänger Java Basics - Anfänger-Themen 16
D Probleme mit jdbc Java Basics - Anfänger-Themen 9
T JDBC Problemchen Java Basics - Anfänger-Themen 2
B JDBC Treiber lokal installieren ? Java Basics - Anfänger-Themen 2
B JDBC: Bereits in der DB vorhandene Abfrage ausführen Java Basics - Anfänger-Themen 7
G Oracle SQL JDBC in Eclipse laden Java Basics - Anfänger-Themen 2
G Maven Dependency für Oracle JDBC-Driver korrekt festlegen Java Basics - Anfänger-Themen 4
G JDBC - Classpath - Ich werd wahnsinnig! Java Basics - Anfänger-Themen 18
J Fehler bei MySql Anbindung mit JDBC Java Basics - Anfänger-Themen 4
G welche Java-Technologie für JDBC geeignet Java Basics - Anfänger-Themen 6
N JDBC Problem Java Basics - Anfänger-Themen 5
M Datenbankzugriff via JDBC Java Basics - Anfänger-Themen 8
S JDBC und NullpointerException Java Basics - Anfänger-Themen 5
S JDBC Verbindungen Java Basics - Anfänger-Themen 2
M JDBC Treiber LGPL Java Basics - Anfänger-Themen 11
D JDBC Treiber unter dem Java Application Server Java Basics - Anfänger-Themen 6
J java und jdbc mit access Java Basics - Anfänger-Themen 3
J JDBC Crash Kurs Java Basics - Anfänger-Themen 3
D Einige Fragen zu Java Java2D JDBC usw. XD Java Basics - Anfänger-Themen 13
D Kleines Problem mit JDBC Java Basics - Anfänger-Themen 2
T SWT-Tabelle aus JDBC füllen Java Basics - Anfänger-Themen 8
C jdbc Anfänger Tutorial gesucht Java Basics - Anfänger-Themen 19
H JDBC in den Klassenpfad eintragen Java Basics - Anfänger-Themen 4
J jdbc getTableName Java Basics - Anfänger-Themen 12
R JDBC Verbindung geht nicht Java Basics - Anfänger-Themen 4
S Problem mit JDBC und Transaktion Java Basics - Anfänger-Themen 12
G hilfe jsp/servlet,jdbc api running on tomcat server+webProxy Java Basics - Anfänger-Themen 8
K JDBC - Typ Connection in jeder Klasse neu öffnen? Java Basics - Anfänger-Themen 4
megachucky nochmal JDBC. komme nicht weiter. Java Basics - Anfänger-Themen 4
megachucky JDBC-Grundlagen: Verständnisprobleme Java Basics - Anfänger-Themen 31
B non-modular dependency in modularem Projekt verwenden Java Basics - Anfänger-Themen 3
L Aus einer Methode eine eigene Klasse machen - modular coden Java Basics - Anfänger-Themen 14
G Programm modular aufbauen Java Basics - Anfänger-Themen 24

Ähnliche Java Themen

Neue Themen


Oben