Java™ Servlet Technologie
zurück weiter
Java™ Servlet Technologie

Anwendungsbeispiel


Die Hilfsklasse OraDBConnect

Die Klasse OraDBConnect stellt für die Servlets Methoden zum Datenbank-Verbindungsaufbau und -abbau sowie zur Ausführung von SELECT-, INSERT-, UPDATE- und DELETE-Anweisungen zur Verfügung. Der Verbindungsaufbau zur Datenbank erfolgt dabei im Konstruktor der Klasse. Deshalb muß bei der Erzeugung eines Objektes dieser Klasse ein sogenannter Connect-String als Parameter übergeben werden.

    // globales Objekt für Datenbankzugriff innerhalb der Klasse
    private Connection conn = null;

    // Verbindungsaufbau
    public OraDBConnect(String connect_string) throws SQLException {
        try {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            conn = DriverManager.getConnection(connect_string);
        }
        catch (SQLException e) {
            if (e instanceof SQLException)
                throw (SQLException)e;
            else
                throw new SQLException("Folgender Fehler ist aufgetreten: " + e);
        }
    }
    
Die Vorgehensweise beim Verbindungsaufbau erfolgt dabei genau so, wie es in den Grundlagen im vorigen Kapitel beschrieben wurde. Außerdem erfolgt eine Fehlerbehandlung mittels Kapselung durch einen try{}-Block, bei der geprüft wird, ob es sich um einen SQL-Fehler handelt, und dementsprechend eine Meldung ausgegeben. Die Prüfung im eventuellen Fehlerfall auf einen SQL-Fehler macht sich erforderlich, weil beim Registrieren des Treibers mittels der Methode registerDriver() der Fall auftreten könnte, daß der Treiber nicht gefunden wird. In diesem Fall würde aber eigentlich keine SQL-Exception vorliegen.

Zum Trennen einer bestehenden Datenbankverbindung wird die Methode OraDBClose() zur Verfügung gestellt. Die Vorgehensweise beim Verbindungsabbau erfolgt dabei genau so, wie es in den Grundlagen im vorigen Kapitel beschrieben wurde.


    // Verbindungsabbau
    public void OraDBClose() throws SQLException {
        conn.close();
    }
    
An dieser Stelle genügt es, die Fehlerbehandlung mittels throws-Anweisung durchzuführen.

Zum Ausführen von SELECT-Anweisungen auf der Datenbank wird die Methode OraDBgetResult() bereitgestellt. Diese bekommt beim Aufruf drei Parameter übergeben und liefert das Ergebnis der Abfrage in Form eines Vector-Objektes, welches Zeichenketten enthält, zurück. Während der Parameter sql die SELECT-Anweisung enthält, muß der Parameter args mit den Namen der Spaltenattribute initialisiert werden, die im SELECT-Abschnitt der Abfrage deklariert wurden. Diese Attributnamen werden innerhalb der Methode benötigt, um die zugehörigen Werte aus der Ergebnismenge zu ermitteln. Der Parameter mode gibt schließlich an, ob alle Tupel der Ergebnismenge zurückgeliefert werden sollen (mode mit 0 belegt), oder nur der erste.

    
    // Datenbankabfrage mit Rückgabe des Ergebnisses in Form eines Vector-Objektes
    public Vector OraDBgetResult(String sql, String[] args, int mode)
    throws SQLException
    {
        Vector result = new Vector();
        Statement sment = conn.createStatement();
        ResultSet rs = sment.executeQuery(sql);
        // wenn Ergebnismenge nicht leer ist
        if (rs.next()) {
            do {
                // alle angeforderten Attribute der Ergebnismenge eines DS zur Liste hinzufügen
                for (int i=0; i<args.length; i++) {
                    // falls NULL-Werte zurückgegeben werden, werden diese durch Leer-Strings ersetzt
                    if (rs.getString(args[i]) != null) {
                        result.addElement(rs.getString(args[i]));
                    }
                    else {
                        result.addElement("");
                    }
                }
            } while (rs.next() && (mode == 0));
        }
        // falls Ergebnismenge leer ist
        else {
            result = null;
        }
        rs.close();
        sment.close();
        return(result);
    }
    
Die Vorgehensweise beim Ausführen einer SELECT-Anweisung erfolgt dabei genau so, wie es in den
Grundlagen im vorigen Kapitel beschrieben wurde. Das Ersetzen von NULL-Werten durch Leer-Strings wäre übrigens beim Füllen des Vector-Objektes nicht unbedingt nötig. Man müßte dann nur bei der Auswertung des Vector-Objektes entsprechend auf NULL-Werte prüfen, bevor man einen Zugriff darauf ausführt. Eventuell auftretende Fehler innerhalb dieser Methode werden im Übrigen durch die in der Methodendeklaration vorkommende throws-Anweisung behandelt.

Die letzte zu dieser Klasse gehörende Methode heißt OraDBexecuteUpdate(). Sie dient der Ausführung von INSERT-, UPDATE- und DELETE-Anweisungen auf einer Datenbank. Als Parameter wird beim Methodenaufruf eine entsprechend formulierte SQL-Anweisung übergeben. Als Rückgabewert liefert OraDBexecuteUpdate() schließlich eine ganze Zahl, welche die Anzahl der von der SQL-Anweisung betroffenen Datensätze beinhaltet.


    // Manipulation von Datensätzen
    public int OraDBexecuteUpdate(String sql)
    throws SQLException
    {
        try {
            conn.setAutoCommit(false);
            Statement sment = conn.createStatement();
            int result = sment.executeUpdate(sql);
            conn.commit();
            conn.setAutoCommit(true);
            // Rückgabewert ist die Anzahl der eingefügten/geänderten/gelöschten Datensätze
            return result;
        }
        catch (SQLException e) {
            conn.rollback();
            conn.setAutoCommit(true);
            throw (SQLException)e;
        }
    }
    
Die Vorgehensweise beim Ausführen einer INSERT-, UPDATE- oder DELETE-Anweisung erfolgt dabei genau so, wie es in den
Grundlagen im vorigen Kapitel beschrieben wurde. Außerdem wird in dieser Methode zum Zwecke der Demonstration der Einsatz von manuell gesteuertem Transaktionsbetrieb dargestellt, was aber im speziellen Beispiel eigentlich nicht erforderlich wäre, da innerhalb der Methode ohnehin nur eine einzige Schreiboperation auf der Datenbank ausgeführt wird.

Eventuell auftretende Fehler innerhalb dieser Methode werden wiederum durch die in der Methodendeklaration vorkommende throws-Anweisung behandelt.

zurück weiter