Aufbau einer DB-Klasse

Status
Nicht offen für weitere Antworten.

Hannes23

Bekanntes Mitglied
Hallo,

ich bastle gerade an einer Datenkbankklasse zum Zugriff auf eine MySQL-Datenbank, sie sieht folgendermaßen aus:

Code:
public class db {
  
      public static void opendb( String host, String dbName, String dbUser, String dbPwd ) {
    
        String port = "3306";
        String dbType = "mysql";

        String myDrivers =
            "com.mysql.jdbc.Driver" +
            ":" +
            "oracle.jdbc.driver.OracleDriver";

        System.setProperty(
            "jdbc.drivers",
            myDrivers
        );

     
        try {
            Class.forName(
                "com.mysql.jdbc.Driver"
            );
        } catch ( Exception ex ) {
            System.err.print( ex );
            System.exit( 1 );
        }


        // Verbindung zur DB aufbauen
        Connection conn = null;

        String uri = "jdbc:" + dbType + "://" +
            host + ":" + port + "/" +
            dbName;
        try {
            conn = DriverManager.getConnection(
                uri,
                dbUser,
                dbPwd
            );
            
        } catch ( Exception ex ) {
            System.err.print( ex );
            System.exit( 1 );
        } 
        System.exit( 0 );
	
    }
    
    
    
    
    
    
    
    public void sql_query() {
	   
	... [Abfragen]
	
    }
    
    
    
    public void close_db() {
	     if ( conn != null ) {
                try {
                    conn.close();
                } catch ( Exception ign ) {}
            }
    }
}

Meine Probleme/Fragen:

-Würdet an diesem Herangehen etwas als grundsätzlich falsch bezeichnen, sprich ist etwas dabei, das man auf keinen Fall so machen sollte?

-Ich habe eine Funktion zum Aufbau der Verbindung, eine Funktion für Abfragen und eine zum Beenden der Verbindung. Ich wollte zu Beginn des Programms die Funktion OpenDB aufrufen, dann wenn ich Abfragen brauche die Funktion sql_query und beim Schließen des Programms close_db(). Dabei hab ich natürlich das Problem, dass das Connectionobjekt conn in der openDB erstellt wird und ich somit in der sql_query und in der close_db nicht darauf zugreifen kann, was aber nötig ist. Wie kann ich das umgehen?

Danke, Hannes
 

Exceptionist

Aktives Mitglied
wir haben in unserem unterricht eine klasse DBTool geschrieben, die kannste in einem extra-package reinpacken.
den qelcode dafür siehst du hier:
Code:
package util;
import java.sql.*;
import java.util.*;
public class DBTool {
    private static DBTool tool;
    private String driver ="org.gjt.mm.mysql.Driver";
    private String verbindung ="jdbc:mysql://localhost:3306/test";
    private String user="root";
    private String password="welcome";
    private Connection con;
    private Vector vHeader = new Vector();
    private PreparedStatement psInsert ;
    private PreparedStatement psDelete ;
    private DBTool() {
        this("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost:3306/test", "root","welcome");
    }
    private DBTool(String driver, String verbindung, String user, String password) {
        this.driver = driver;
        this.verbindung=verbindung;
        this.user=user;
        this.password=password;
        
        try {
            Class.forName(driver);
            con = DriverManager.getConnection(verbindung,user,password);
            psInsert = con.prepareStatement("INSERT INTO tab_mitarbeiter values(?,?,?)");
            psDelete = con.prepareStatement("DELETE FROM  tab_mitarbeiter where vn = ? AND nn = ?");
        } catch (Exception e) {
            System.out.println("Problem in DBTool Konstuktor" + e);
            System.exit(0);
        }
        
    }
    public static DBTool getInstance() {
        // wenn das Objekt noch nicht erzeugt werde
        if (tool == null) {
            tool = new DBTool();
        }
        return tool ;
    }
    public Vector getHeader() {
        if (vHeader.size() ==  0){
              getAllRecords();
        }
        return vHeader;
    }
    public Vector getAllRecords() {
        Vector megaVector = new Vector();
        try {
            Statement stmt = con.createStatement();
            
            ResultSet rs = stmt.executeQuery("SELECT * FROM tab_mitarbeiter");
            ResultSetMetaData rsmd = rs.getMetaData();
            
            int count = rsmd.getColumnCount();
            vHeader.clear();
            for (int i = 1; i<= count;i++) {
                    
                        vHeader.add(rsmd.getColumnLabel(i));
                    }
            // Schleife die Satz für Satz durch RS läuft
            while (rs.next()) {
                Vector satzVector =new Vector();
                // Spaltenschleife
                for (int i = 1; i<= count;i++) 
                    {
                        satzVector.add(rs.getString(i));
                    }
                    megaVector.add(satzVector);
                
            }
            
           
        } catch (SQLException se ) {
            System.out.println("Problem in getAllRecords() " +se);
        }
         return megaVector;
    } 
    public void loeschen(String vn, String nn) {
        try {
        psDelete.setString(1, vn);
        psDelete.setString (2,nn);
        psDelete.executeUpdate();
        } catch (SQLException se )
        {
            System.out.println(" Problem beim loeschen" + se);
        }
    }
    public void einfuegen(String vn, String nn, double gehalt) throws SQLException 
     
    {
    try {
        // hier ein bereits vorhandenes PreparedStatment
        psInsert.setString(1,vn);
        psInsert.setString(2, nn);
        psInsert.setDouble(3, gehalt);
        psInsert.executeUpdate();
    } catch (SQLException se ) {
        System.out.println("Probleme in einfuegen ");
        throw se;
    }
    }
    
    public static void main(String [] args) {
       DBTool tool = DBTool.getInstance();
       Vector inhalt = tool.getAllRecords();
       System.out.println(inhalt );
       Vector header = tool.getHeader();
       System.out.println(header );
       inhalt = tool.getAllRecords();
    }
}

ich hoffe es ist nicht schlimm, dass ich hier auf bestimte tabellen verweise
und nicht mit stellvetretenden ausdrücken gearbeitet hab...

bei fragen zur datenbank, die hinter dieser klasse steckt, stehe ich gerne zur verfügung.
ich hoffe mal der rest erklärt sich von selbst.
 

Hannes23

Bekanntes Mitglied
aber wie machst Du das beispielsweise, wenn diese Datenbankklasse in einer eigenen Datei ist und z.B. eine Datei Hauptprogramm.java dann darauf zugreifen soll? Dann bekomme ich beim Kompillieren des "Hauptprogramms" mit dem Aufruf

Code:
 DBTool tool = DBTool.getInstance();
       Vector inhalt = tool.getAllRecords();
       System.out.println(inhalt );

im "Hauptprogramm" nämlich folgenden Fehler:

Code:
Hauptprogramm.java:13: cannot resolve symbol
symbol  : class Vector
location: class Hauptprogramm
       Vector inhalt = tool.getAllRecords();
       ^

Oder hast Du das irgendwie über das package gelöst??
 
G

Guest

Gast
ich geb dir jetzt nur kurze informationen, denn dann ist dein lern-effekt grösser und ich kann dir helfen UND für meine zertifizierung pauken...

also:
Code:
DBTool tool = DBTool.getInstance(); 
       Vector inhalt = tool.getAllRecords(); 
       System.out.println(inhalt );
ist wichtig, damit die klasse DBTool als Singleton läuft und das Objekt dementsprechend auch wirklich nur 1 mal existiert.

dann musste das Package, in dem du das tool hast, in dein hauptprogramm importieren und das tool als Attribut bekannt machen.
Code:
import util.*;

bla bla bla (String []args){

private DBTool tool;
...
usw

was ein Vector ist weisst du doch bestimmt oder nicht??
den musste nämlich mit ner doppelten FOR-Schleife auslesen... es sei denn du hast lust den kompletten tabellen-inhalt auf einmal anzuzeigen
das system.out.println(inhalt); ist lediglich eine kontrolle gewesen.

wenn dir das hier noch nicht geholfen haben sollte, musste leider nochmal bescheid geben.
 

Exceptionist

Aktives Mitglied
wo sind eigentlich die .close() Methoden im DBTool?

wir haben das Tool hauptsächlich in serverseitigen anwendungen benutzt und im hauptprogramm bzw im hauptservlet
session.invalidate(); benutzt, denn ohne gültige session hatten wir kein DBTool zur verfügung.

also wir hatten auch noch keine probleme damit.
unser dozent sagte mal irgendwann, dass wir hier keine close-methode bräuchten, es geschiehe implizit, das das close(); aufgerufen wird!


hier sind nochmal 5 Schritte, wie das mit ner datenbank-anbindung klappt!!!
diesmal etwas allgemeiner!!!
Code:
import java.sql.*; 
  public class FuenfSchritte {
    public static void main(String[] args) throws Exception {

   1   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection c = DriverManager.getConnection("jdbc:odbc:Kurse");


   2   Statement s = c.createStatement();


   3   s.execute("SELECT * FROM Personen WHERE nachname LIKE 'K%'");
        ResultSet r = s.getResultSet();

   4   while(r.next())
        System.out.println(r.getString("vorname")+" "+r.getString("nachname"));

   5   c.close();
    }
  }

Die Durchnummerierung solltet ihr natürlich beim programmieren auskommentieren oder ganz weglassen
 

Bleiglanz

Gesperrter Benutzer
wir haben das Tool hauptsächlich in serverseitigen anwendungen benutzt und im hauptprogramm bzw im hauptservlet
session.invalidate(); benutzt, denn ohne gültige session hatten wir kein DBTool zur verfügung.
drum auch das System.exit(0), damit der Server gleich sauber beendet wird

also wir hatten auch noch keine probleme damit.
unser dozent sagte mal irgendwann, dass wir hier keine close-methode bräuchten, es geschiehe implizit, das das close(); aufgerufen wird!
scheint ein Zertifikatslehrgang zu sein
 

Exceptionist

Aktives Mitglied
es ist ein zertifizierungslehrgang!

ich bin momentan in der Bonner Akademie und mache einen Lehrgang zum "Sun Certified Java Programmer"
Grundwissen in Sachen Oracle9i (SQL) ist auch mit dabei.
jedoch nutzen wir für kleinere projekte im bereich java eine MySQL-datenbank.


das hatte zur folge, dass wir einfach mal ein DBTool geschrieben haben....

und bei mir hat immer alles einwandfrei funktioniert.
letzte prüfung hab ich mit 100% bestanden
 

Bleiglanz

Gesperrter Benutzer
schon klar

und bei mir hat immer alles einwandfrei funktioniert.
das hört man leider viel zu oft von Programmierern deren Programm gerade einmal NICHT funktioniert :)

ist zwar off-topic: vHeader ist ein potentielles Speicherleck und nicht threadsafe, würde mal sagen dass das DBTool für serverseitige Apps nicht wirklich geeignet ist...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Aufbau meiner Datenbank/Tabelle - Verbessern? So lassen? Datenbankprogrammierung 39
Anfänger2011 Datenbankstruktur/aufbau (theoretisches Problem) Datenbankprogrammierung 5
F MySQL Aufbau der Datenbanktabelle Datenbankprogrammierung 2
Cypha JPA Syntax error - falscher Aufbau? Datenbankprogrammierung 3
E MSSQL-Server connection aufbau sehr langsam Datenbankprogrammierung 2
G Datenbank aufbau? Datenbankprogrammierung 4
D DAtenbankanbindung im OO-Aufbau Datenbankprogrammierung 5
W properties.txt Aufbau Problem Datenbankprogrammierung 6
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
D Zweckmäßigkeit einer Schlüsseltabelle Datenbankprogrammierung 4
TH260199 Java-Programm. Probleme bei der Umsetzung von einer Kontaktverwaltung. Datenbankprogrammierung 7
S Variable in main soll mit der generierten Zahl aus einer Methode ausgefüllt werden Datenbankprogrammierung 3
N Oracle SQL - Nächst kleineren Namen2 zu einem Namen aus einer Tabelle Datenbankprogrammierung 3
T Datenbank auf einer Webseite aus einer Exceltabelle erstellen Datenbankprogrammierung 5
D JPA gleiche methode funktioniert an einer Stelle, an der anderen nicht Datenbankprogrammierung 3
nonickatall MySQL Auf neue Datensätze in einer Datenbank reagieren Datenbankprogrammierung 5
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
P Verbindung zu einer Access Datenbank per Eclipse oder Intellij Datenbankprogrammierung 0
pkm Frage zu Encodingproblem bei einer Datenbankanbindung Datenbankprogrammierung 1
B Frage bei einer SQL Query Datenbankprogrammierung 3
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
J In einer bestimmten Spalte suchen mit Suchfeld (MS SQL) Datenbankprogrammierung 7
S Verbindung von einer Excel Datei zu Java Datenbankprogrammierung 2
J Sql Anfrage nach einer Zeile beenden Datenbankprogrammierung 6
J Welche Kriterien haben Einfluss auf die Geschwindigkeit einer Datenbank ? Datenbankprogrammierung 4
S Anmelden an einer msql datennbank Datenbankprogrammierung 1
F Auslesen einer .dbf-Datei, Zuordnung Index Datenbankprogrammierung 0
ralfb1105 Oracle Zwei ojdbc Driver in einer Applikation? Datenbankprogrammierung 13
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
Dimax MySQL 10 höchsten Werte aus einer Tabelle ermitteln Datenbankprogrammierung 30
L Speicherverbrauch Java Anwendung mit einer Datenbankanbindung Datenbankprogrammierung 19
temi Wie kann ich "Class" in einer DB speichern? Datenbankprogrammierung 2
F UPDATE - Befehl nur in einer Zeile Datenbankprogrammierung 11
I Oracle Wie ermitteln, welche Benutzer-(!)Tabellen in einer DB sind? Datenbankprogrammierung 1
DaCrazyJavaExpert Derby/JavaDB Wert einer Variable in der Datenbank direkt auf 1 setzten. Datenbankprogrammierung 71
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
F Java Objekte in einer Datenbank speichern Datenbankprogrammierung 4
MrSnake Hilfe bei erstellen einer DB Datenbankprogrammierung 12
M Wie übergebe ich Datenbankobjekte aus einer sql-Datenbank einer Java Klasse bzw. Instanz Datenbankprogrammierung 7
Z Finde den Fehler: Daten aus einer Access-Datenbank lesen Datenbankprogrammierung 12
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
E Wie kann man mit einer ID-Spalte über eine Parameterübergabe auf eine Seite verweisen? Datenbankprogrammierung 17
E Warum funktioniert das Erzeugen einer View nicht? Datenbankprogrammierung 1
E Kann man in einer if-Bedingung auch SELECT-Statements überprüfen? Datenbankprogrammierung 23
E Was sind die Vorteile von DB2 im Gegensatz zu einer Oracle-Datenbank? Datenbankprogrammierung 5
E Wie geschieht der konzeptueller Entwurf einer Datenbank Datenbankprogrammierung 1
I SQLite Objekt speichern einer Serialisierter Klasse Datenbankprogrammierung 1
D HSQLDB INSERT INTO in einer For Schleife mit selber ID, machbar? Alternative? Datenbankprogrammierung 7
I Inhalt einer hsqldb anzeigen Datenbankprogrammierung 1
J Realisierung einer DB in Combi mit Java Datenbankprogrammierung 13
Androbin [Serializing] Mehrere Objekte in einer einzigen Datei speichern Datenbankprogrammierung 1
S Auswahl einer Datenbank Datenbankprogrammierung 0
M Derby/JavaDB Speicherplatz einer Zeile bestimmen Datenbankprogrammierung 0
P JPA in einer größeren Java SE Anwendung Datenbankprogrammierung 0
R MySQL Blob aus DB auslesen und einer Tabelle ausgeben Datenbankprogrammierung 7
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
L MySQL Uhrzeit-Format innerhalb einer Tabelle Datenbankprogrammierung 8
2 MySQL Daten aus einer Array auslesen und MySQL Statment erstellen. Datenbankprogrammierung 5
S Derby/JavaDB Probleme beim anlegen einer embedded DB Datenbankprogrammierung 13
E Daten einer SQL-Datenbank aus Combobox in labels schreiben Datenbankprogrammierung 6
M Problem beim Erstellen einer Query Datenbankprogrammierung 7
L Datenbankabfrage mit einer Range Datenbankprogrammierung 3
S Anbindung einer Datenbank an Java Datenbankprogrammierung 7
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
eskimo328 Datenbankverbindung ohne Passwort im Quelltext bei einer offline Anwendung Datenbankprogrammierung 14
C unverständliches DB Problem (Es ist kein temporärer Systemtabellenbereich mit einer ausreichenden..) Datenbankprogrammierung 5
A Oracle Update Befehl in Datenbank anhand einer Schleife Datenbankprogrammierung 8
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
S 2 Tabellen zu einer zusammenführen, INSERT INTO Fehler Datenbankprogrammierung 5
D Sperrverfahren in einer Datenbank Datenbankprogrammierung 6
B Feld in einer @Entity als Text speichern Datenbankprogrammierung 5
G Oracle Hibernate M:N-Beziehung mit nur einer vorhandenen Tabelle Datenbankprogrammierung 5
M MySQL Auto-Increment einer custom formatted id? Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
M DB: Mehrere Zeilen in einer Zeile zusammenführen Datenbankprogrammierung 10
D Probleme bei der Erzeugung einer Tabelle Datenbankprogrammierung 15
D Frage zu potenziellen Leerzeichen in einer Datenbank Datenbankprogrammierung 5
H datantyp einer variable ermittel mit sql Datenbankprogrammierung 3
I Zugriff auf Datenbank nach Erstellen einer Executable Jar Datei verweigert Datenbankprogrammierung 10
S Problem beim Anlegen einer Tabelle Datenbankprogrammierung 5
S Wie überprüfe ich ob die Instanz einer Connection gerade werwendet wird? Datenbankprogrammierung 4
M Ausgabe der Rows mit höchstem Wert X einer Gruppe y,z ? Datenbankprogrammierung 2
L Derby/JavaDB Fehler beim Erstellen einer Tabelle Datenbankprogrammierung 2
turmaline [Hibernate] @OneToOne: Löschen einer referenzierten Instanz Datenbankprogrammierung 2
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
B Aktuellen Stand der Datensätze einer Datenbank anzeigen Datenbankprogrammierung 9
B Die Anzahl der Datensaetze einer Datenbank anzeigen Datenbankprogrammierung 2
T Ablage von Benutzereinstellungen in einer DB Datenbankprogrammierung 7
T Inhalt einer Datenbanktabelle autom. in XML ausgeben Datenbankprogrammierung 7
M Oracle Probleme mit dem anbinden einer Oracle 10g Datenbank Datenbankprogrammierung 27
B MySQL Row und ColumnIndex aus einer JTable (mysqlDb) selectieren Datenbankprogrammierung 18
C Hibernate Liste mit allen Objekten einer Entity Datenbankprogrammierung 17
M Sinnvoller Entwurf einer Java DB-Anwendung Datenbankprogrammierung 2
E MySQL Befüllen einer MySQL DB mit großen Daten Datenbankprogrammierung 6
Airwolf89 Spaltennamen einer Tabelle zurückgeben lassen Datenbankprogrammierung 9
1 Aufruf einer View über Java Gui Datenbankprogrammierung 5
J Mit einer Abfrage Worte suchen die in Zwei Tabellen enthalten sind Datenbankprogrammierung 5
M FindBugs und PreparedStatement aus einer Datei lesen Datenbankprogrammierung 11

Ähnliche Java Themen

Neue Themen


Oben