19.2 Anwendungsabhängige Datenbankzugriffsklasse

Relationale Datenbankmanagementsysteme können keine Objekte, sondern nur deren Attributwerte speichern.

Für jede Fachklasse benötigen wir daher eine spezielle Datenbankzugriffsklasse, die in der Lage ist, die Attributwerte von Objekten der jeweiligen Fachklasse auszulesen und mit Hilfe der anwendungsunabhängigen Datenbankzugriffsklasse DBZugriff in der Datenbank zu speichern.
Außerdem muss sie bei einer Datenabfrage aus den Datensätzen des von DBZugriff gelieferten Abfrageergebnisses die entsprechenden Daten auslesen und neu erzeugten Fachobjekten als Attributwerte zuweisen können.

Im Folgenden erstellen wir beispielhaft die spezielle Datenbankzugriffsklasse DBZugriffArtikel. Diese erlaubt uns Daten von Objekten der Fachklasse Artikel zu speichern beziehungsweise die entsprechenden Daten aus der Datenbank abzufragen und daraus wieder Artikel-Objekte zu erzeugen.

img/Abb_19_12_UML_DBZugriffArtikel.svg
datenzugriff.DBZugriffArtikel
public ArrayList<Artikel> erstelleArtikelListe()
Lädt alle Artikeldaten aus der Datenbank und erzeugt daraus eine ArrayList<Artikel>, die an den Aufrufer zurückgegeben wird.
public Artikel ladeArtikel(String pArtNr)
Lädt die Daten des Artikels mit der Artikelnummer pArtNr aus der Datenbank, erzeugt daraus ein entsprechendes Objekt und gibt dieses zurück.
public boolean erfasseNeuenArtikel(Artikel pArtikel)
Erfasst die Daten des neuen Artikels in der entsprechenden Datenbanktabelle.
Rückgabe: true, wenn der Vorgang erfolgreich war, andernfalls false.
public boolean aendereArtikel(Artikel pArtikel)
Aktualisiert die Daten des übergebenen Artikels in der Datenbank.
Rückgabe: true, wenn der Vorgang erfolgreich war, andernfalls false.
public boolean loescheArtikel(String pArtNr)
Löscht den Artikel mit der übergebenen Artikelnummer aus der Datenbank.
Rückgabe: true, wenn der Vorgang erfolgreich war, andernfalls false.
public boolean istArtNrVergeben(String pArtNr)
Prüft, ob die übergebene Artikelnummer in der Datenbank bereits vergeben ist.
Rückgabe: true, wenn die Artikelnummer bereits vergeben ist, andernfalls false.
Abb. 19-12: Die Klasse DBZugriffArtikel (UML)

19.2.1 Alle Artikel laden

JAVA
package datenzugriff;

import fachklassen.Artikel;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DBZugriffArtikel {
    
    private DBZugriff dbZugriff = new DBZugriff("localhost","artikelverwaltung","root","");
    
    //Lädt alle Artikeldaten aus der DB und erzeugt daraus eine ArrayList<Artikel>
    public ArrayList<Artikel> erstelleArtikelliste() {
        ArrayList<Artikel> artikelliste = new ArrayList<Artikel>(); //Leere Artikelliste
        Artikel artikel;
        ResultSet abfrageergebnis;
        String sql;
        
        if( dbZugriff.openConnection() ) {
            sql = "SELECT * FROM artikel;";
            System.out.println(sql);
            abfrageergebnis = dbZugriff.executeQuery(sql);
            try{
                if(abfrageergebnis!=null) {
                    while(abfrageergebnis.next()) {
                        artikel = new Artikel( abfrageergebnis.getString("ArtNr") );
                        artikel.setArtBez( abfrageergebnis.getString("ArtBez") );
                        artikel.setVkPreis( abfrageergebnis.getDouble("VkPreis") );
                        artikel.setBestand( abfrageergebnis.getInt("LBestand") );
                        artikelliste.add(artikel);
                    }
                }
            }
            catch(SQLException e){
                System.out.println("Fehler beim DB-Zugriff!"+e.toString());
            }
            finally {
                dbZugriff.closeConnection();
            }
        }
        
        return artikelliste;
    }

    //...
}
Abb. 19-13: Quellcode der Klasse DBZugriffArtikel (Ausschnitt)
Aufgabe

Aufgabe 19-4: Test – erstelleArtikelliste(): ArrayList<Artikel>

Erstellen Sie die Klasse TestDBZugriffArtikel1. Deren main-Methode soll die Methode erstelleArtikelliste(): ArrayList<Artikel> der Klasse DBZugriffArtikel aufrufen und die Daten der in der ArrayList<Artikel> enthaltenen Artikel-Objekte auf der Konsole ausgeben. Sollten in der Datenbank keine Artikel gespeichert sein, soll stattdessen eine entsprechende Meldung ausgegeben werden.

Lösung
Lösung
JAVA
package test;

import java.util.ArrayList;
import datenzugriff.DBZugriffArtikel;
import fachklassen.Artikel;

public class TestDBZugriffArtikel1 {

    //Test der Methode erstelleArtikelliste(): ArrayList<Artikel>
    public static void main(String[] args) {
        DBZugriffArtikel dbZugriffArtikel = new DBZugriffArtikel();
        ArrayList<Artikel> artikelliste;
        Artikel artikel;
        
        artikelliste = dbZugriffArtikel.erstelleArtikelliste();
        
        for(int i=0; i<artikelliste.size(); i++) {
            artikel = artikelliste.get(i);
            System.out.print(artikel.getArtNr() + "\t");
            System.out.print(artikel.getBestand() + "\t");
            System.out.print(artikel.getVkPreis() + "\t");
            System.out.print(artikel.getArtBez() + "\n");
        }
        
        if(artikelliste.size()==0) {
            System.out.println("In der Datenbank sind keine Artikeldaten gespeichert.");
        }
        
    }
}
Abb. 19-14: Klasse TestDBZugriffArtikel1 (Quellcode)

19.2.2 Den zu einer Artikelnummer gehörenden Artikel laden

Aufgabe

Aufgabe 19-5: ladeArtikel(pArtNr: String): Artikel

Erstellen Sie in der Klasse DBZugriffArtikel die Methode ladeArtikel(pArtNr: String): Artikel. Orientieren Sie sich dabei am Aufbau der Methode erstelleArtikelliste(): ArrayList<Artikel> (vgl. Abbildung 19-13).

Lösung
Lösung
JAVA
package datenzugriff;

import fachklassen.Artikel;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DBZugriffArtikel {
    
    private DBZugriff dbZugriff = new DBZugriff("localhost","artikelverwaltung","root","");
    
    //...

    //Lädt den Artikel mit der ArtNr pArtNr aus der Datenbank.
    public Artikel ladeArtikel(String pArtNr) {
        ResultSet abfrageergebnis;
        String sql;
        Artikel artikel = null; //gesuchter Artikel
        
        if( dbZugriff.openConnection() ) {
            sql = "SELECT * FROM artikel "
                + "WHERE ArtNr = '" + pArtNr + "';";
            System.out.println(sql);
            abfrageergebnis = dbZugriff.executeQuery(sql);
            try{
                if(abfrageergebnis!=null && abfrageergebnis.next()) {
                    artikel = new Artikel( abfrageergebnis.getString("ArtNr") );
                    artikel.setArtBez( abfrageergebnis.getString("ArtBez") );
                    artikel.setVkPreis( abfrageergebnis.getDouble("VkPreis") );
                    artikel.setBestand( abfrageergebnis.getInt("LBestand") );
                }
            }
            catch(SQLException e){
                System.out.println("Fehler beim DB-Zugriff!"+e.toString());
            }
            
            finally {
                dbZugriff.closeConnection();
            }
        }
        
        return artikel;
    }

    //...
}
Abb. 19-15: Quellcode der Klasse DBZugriffArtikel (Ausschnitt)
Aufgabe

Aufgabe 19-6: Test – ladeArtikel(pArtNr: String): Artikel

Erstellen Sie die Klasse TestDBZugriffArtikel2. Deren main-Methode soll mit Hilfe der Methode ladeArtikel(pArtNr: String): Artikel der Klasse DBZugriffArtikel den Artikel mit der Artikelnummer 72927 laden und die Daten des zurückgegebenen Artikel-Objekts auf der Konsole ausgeben. Falls in der Datenbank unter dieser Artikelnummer kein Artikel gefunden wurde, soll stattdessen eine entsprechende Meldung ausgegeben werden.

Lösung
Lösung
JAVA
package test;

import datenzugriff.DBZugriffArtikel;
import fachklassen.Artikel;

public class TestDBZugriffArtikel2 {

    //Test der Methode ladeArtikel(): Artikel
    public static void main(String[] args) {
        DBZugriffArtikel dbZugriffArtikel = new DBZugriffArtikel();
        String artNr = "23456";
        Artikel artikel = dbZugriffArtikel.ladeArtikel(artNr);
    
        if(artikel!=null) {
            System.out.print(artikel.getArtNr() + "\t");
            System.out.print(artikel.getBestand() + "\t");
            System.out.print(artikel.getVkPreis() + "\t");
            System.out.print(artikel.getArtBez() + "\n");
        }
        else {
            System.out.println("In der Datenbank gibt es keinen Artikel mit der Artikelnummer '" + artNr +"'.");
        }
    }

}
Abb. 19-16: Klasse TestDBZugriffArtikel2 (Quellcode)

19.2.3 Prüfen, ob eine Artikelnummer bereits vergeben ist

Aufgabe

Aufgabe 19-7: istArtNrVergeben(pArtNr: String): boolean

Erstellen Sie in der Klasse DBZugriffArtikel die Methode istArtNrVergeben(pArtNr: String): boolean.

Lösung
Lösung
JAVA
package datenzugriff;

import fachklassen.Artikel;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DBZugriffArtikel {
    
    private DBZugriff dbZugriff = new DBZugriff("localhost","artikelverwaltung","root","");
    
    //...

    //Prüft, ob die übergebene ArtNr bereits vergeben ist.
    public boolean istArtNrVergeben(String pArtNr) {
        boolean vergeben = true;
        ResultSet abfrageergebnis;
        String sql;
        int anzahlDatensaetze;
        
        if( dbZugriff.openConnection() ) {
            sql = "SELECT COUNT(*) FROM artikel "
                + "WHERE ArtNr = '" + pArtNr + "';";
            System.out.println(sql);
            abfrageergebnis = dbZugriff.executeQuery(sql);
            try{
                if(abfrageergebnis!=null) {
                    abfrageergebnis.next();                        //Datensatzzeiger auf den ersten Datensatz setzen.
                    anzahlDatensaetze = abfrageergebnis.getInt(1); //Wert der ersten Spalte auslesen.
                    if(anzahlDatensaetze==0) {
                        vergeben=false;
                    }
                }
            }
            catch(SQLException e){
                System.out.println("Fehler beim DB-Zugriff!"+e.toString());
            }
            
            finally {
                dbZugriff.closeConnection();
            }
        }
        
        return vergeben;
    }

    //...
}
Abb. 19-17: Quellcode der Klasse DBZugriffArtikel (Ausschnitt)

19.2.4 Einen neuen Artikel erfassen

Aufgabe

Aufgabe 19-8: erfasseNeuenArtikel(pArtikel: Artikel): boolean

Erstellen Sie in der Klasse DBZugriffArtikel die Methode erfasseNeuenArtikel(pArtikel: Artikel): boolean.

Lösung
Lösung
JAVA
package datenzugriff;

import fachklassen.Artikel;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DBZugriffArtikel {
    
    private DBZugriff dbZugriff = new DBZugriff("localhost","artikelverwaltung","root","");
    
    //...

    //Erfasst die Daten des neuen Artikels in der entsprechenden Datenbanktabelle.
    public boolean erfasseNeuenArtikel(Artikel pArtikel) {
        boolean hinzugefuegt = false;
        String sql;
        
        if( pArtikel!=null && dbZugriff.openConnection() ) {
            sql = "INSERT INTO artikel(ArtNr, ArtBez, VkPreis, LBestand) "
                + "VALUES("
                       + "'" + pArtikel.getArtNr() + "', "
                       + "'" + pArtikel.getArtBez() + "', "
                             + pArtikel.getVkPreis() + ", "
                             + pArtikel.getBestand()
                + ");";
            System.out.println(sql);
            hinzugefuegt = dbZugriff.executeUpdate(sql);  //SQL-Anweisung ausführen
            dbZugriff.closeConnection();                  //Belegte Ressorucen freigeben
        }
        
        return hinzugefuegt;
    }

    //...
}
Abb. 19-18: Quellcode der Klasse DBZugriffArtikel (Ausschnitt)
Aufgabe

Aufgabe 19-9: Test – erfasseNeuenArtikel(pArtikel: Artikel): boolean

Erstellen Sie die Klasse TestDBZugriffArtikel3. Deren main-Methode soll zunächst ein Objekt der Klasse Artikel (Artikelnummer 23456, der Bezeichnung Testartikel, dem Preis 9.99 und dem Lagerbestand 10) erzeugen. Anschließend soll Sie die Artikelnummer des Objekts abfragen und mit Hilfe der Methode istArtNrVergeben(pArtNr: String): boolean der Klasse DBZugriffArtikel prüfen, ob diese in der Datenbank bereits vergeben ist. Ist dies nicht der Fall soll sie mit Hilfe der Methode erfasseNeuenArtikel(pArtikel: Artikel): boolean der Klasse DBZugriffArtikel den Artikel in der Datenbank speichern. Fehler- beziehungsweise Erfolgsmeldungen sollen auf der Konsole ausgegeben werden.

Lösung
Lösung
JAVA
package test;

import datenzugriff.DBZugriffArtikel;
import fachklassen.Artikel;

public class TestDBZugriffArtikel3 {

    //Test der Methode erfasseNeuenArtikel(Artikel pArtikel): boolean
    public static void main(String[] args) {
        DBZugriffArtikel dbZugriffArtikel = new DBZugriffArtikel();
        Artikel artikel;
        
        artikel = new Artikel("23456");
        artikel.setArtBez("Testartikel");
        artikel.setVkPreis(9.99);
        artikel.setBestand(10);
        
        if(dbZugriffArtikel.istArtNrVergeben(artikel.getArtNr())) {
            System.out.println("In der Datenbank ist bereits ein Artikel mit der Artikelnummer '" + artikel.getArtNr() + "' gespeichert.");
            System.out.println("Der Artikel konnte daher nicht hinzugefügt werden.");
        }
        else {
            if(dbZugriffArtikel.erfasseNeuenArtikel(artikel)) {
                System.out.println("Der Artikel wurde hinzugefügt.");
            }
            else {
                System.out.println("Der Artikel konnte nicht hinzugefügt werden.");
            }
        }
    }

}
Abb. 19-19: Klasse TestDBZugriffArtikel3 (Quellcode)

19.2.5 Die Daten eines vorhandenen Artikel ändern

Aufgabe

Aufgabe 19-10: aendereArtikel(pArtikel: Artikel): boolean

Erstellen Sie in der Klasse DBZugriffArtikel die Methode aendereArtikel(pArtikel: Artikel): boolean.

Lösung
Lösung
JAVA
package datenzugriff;

import fachklassen.Artikel;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DBZugriffArtikel {
    
    private DBZugriff dbZugriff = new DBZugriff("localhost","artikelverwaltung","root","");
    
    //...

    //Aktualisiert die Daten des geänderten Artikels in der entsprechenden Datenbanktabelle.
    public boolean aendereArtikel(Artikel pArtikel) {
        boolean geaendert = false;
        String sql;
        
        if( pArtikel!=null && dbZugriff.openConnection() ) {
            sql = "UPDATE artikel SET "
                    + "ArtBez = '" + pArtikel.getArtBez() + "', "
                    + "VkPreis = " + pArtikel.getVkPreis() + ", "
                    + "LBestand = " + pArtikel.getBestand() + " "
                    + "WHERE ArtNr = '" + pArtikel.getArtNr() + "';";
            System.out.println(sql);
            geaendert = dbZugriff.executeUpdate(sql);  //SQL-Anweisung ausführen
            dbZugriff.closeConnection();               //Belegte Ressorucen freigeben
        }
        
        return geaendert;
    }

    //...
}
Abb. 19-20: Quellcode der Klasse DBZugriffArtikel (Ausschnitt)
Aufgabe

Aufgabe 19-11: Test – aendereArtikel(pArtikel: Artikel): boolean

Erstellen Sie die Klasse TestDBZugriffArtikel4. Deren main-Methode soll zunächst ein Objekt der Klasse Artikel (Artikelnummer 23456, der Bezeichnung Testartikel, dem Preis 5.0 und dem Lagerbestand 20) erzeugen. Anschließend soll Sie die Artikelnummer des Objekts abfragen und mit Hilfe der Methode istArtNrVergeben(pArtNr: String): boolean der Klasse DBZugriffArtikel prüfen, ob diese in der Datenbank bereits vergeben ist. Ist dies der Fall soll sie mit Hilfe der Methode aendereArtikel(pArtikel: Artikel): boolean der Klasse DBZugriffArtikel die Daten des Artikels in der Datenbank aktualisieren. Fehler- beziehungsweise Erfolgsmeldungen sollen auf der Konsole ausgegeben werden.

Lösung
Lösung
JAVA
package test;

import datenzugriff.DBZugriffArtikel;
import fachklassen.Artikel;

public class TestDBZugriffArtikel4 {

    //Test der Methode aendereArtikel(Artikel pArtikel): boolean
    public static void main(String[] args) {
        DBZugriffArtikel dbZugriffArtikel = new DBZugriffArtikel();
        Artikel artikel;
        
        artikel = new Artikel("23456");
        artikel.setArtBez("Testartikel");
        artikel.setVkPreis(5.0);
        artikel.setBestand(20);
        
        if(dbZugriffArtikel.istArtNrVergeben(artikel.getArtNr())) {
            if(dbZugriffArtikel.aendereArtikel(artikel)) {
                System.out.println("Der Artikel wurde geändert.");
            }
            else {
                System.out.println("Der Artikel konnte nicht geändert werden.");
            }
        }
        else {
            System.out.println("In der Datenbank ist kein Artikel mit der Artikelnummer '" + artikel.getArtNr() + "' gespeichert.");
            System.out.println("Der Artikel konnte daher nicht geändert werden.");
        }
    }

}
Abb. 19-21: Klasse TestDBZugriffArtikel4 (Quellcode)

19.2.6 Die Daten eines Artikels löschen

Aufgabe

Aufgabe 19-12: loescheArtikel(pArtNr: String): boolean

Erstellen Sie in der Klasse DBZugriffArtikel die Methode loescheArtikel(pArtNr: String): boolean.

Lösung
Lösung
JAVA
package datenzugriff;

import fachklassen.Artikel;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DBZugriffArtikel {
    
    private DBZugriff dbZugriff = new DBZugriff("localhost","artikelverwaltung","root","");
    
    //...

    //Entfernt den zu löschenden Artikel aus der entsprechenden Datenbanktabelle.
    public boolean loescheArtikel(String pArtNr) {
        boolean geloescht = false;
        String sql;
        
        if( dbZugriff.openConnection() ) {
            sql = "DELETE FROM artikel "
                + "WHERE ArtNr = '" + pArtNr + "';";
            System.out.println(sql);
            geloescht = dbZugriff.executeUpdate(sql);  //SQL-Anweisung ausführen
            dbZugriff.closeConnection();               //Belegte Ressorucen freigeben
        }
        
        return geloescht;
    }

    //...
}
Abb. 19-22: Quellcode der Klasse DBZugriffArtikel (Ausschnitt)
Aufgabe

Aufgabe 19-13: Test – loescheArtikel(pArtNr: String): boolean

Erstellen Sie die Klasse TestDBZugriffArtikel5. Deren main-Methode soll den Artikel mit der Artikelnummer 23456 aus der Datenbank löschen. Fehler- beziehungsweise Erfolgsmeldungen sollen auf der Konsole ausgegeben werden.

Lösung
Lösung
JAVA
package test;

import datenzugriff.DBZugriffArtikel;
import fachklassen.Artikel;

public class TestDBZugriffArtikel5 {

    //Test der Methode loescheArtikel(String pArtNr): boolean
    public static void main(String[] args) {
        DBZugriffArtikel dbZugriffArtikel = new DBZugriffArtikel();

        if(dbZugriffArtikel.loescheArtikel("23456")) {
            System.out.println("Der Artikel wurde gelöscht.");
        }
        else {
            System.out.println("Der Artikel konnte nicht gelöscht.");
        }
    }

}
Abb. 19-23: Klasse TestDBZugriffArtikel5 (Quellcode)