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.
public ArrayList<Artikel> erstelleArtikelListe()ArrayList<Artikel>, die an den Aufrufer zurückgegeben wird.
public Artikel ladeArtikel(String pArtNr) pArtNr aus der Datenbank, erzeugt daraus ein entsprechendes Objekt und gibt dieses zurück.
public boolean erfasseNeuenArtikel(Artikel pArtikel) true, wenn der Vorgang erfolgreich war, andernfalls false.
public boolean aendereArtikel(Artikel pArtikel)true, wenn der Vorgang erfolgreich war, andernfalls false.
public boolean loescheArtikel(String pArtNr) true, wenn der Vorgang erfolgreich war, andernfalls false.
public boolean istArtNrVergeben(String pArtNr)true, wenn die Artikelnummer bereits vergeben ist, andernfalls false.
DBZugriffArtikel (UML)19.2.1 Alle Artikel laden
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;
}
//...
}
DBZugriffArtikel (Ausschnitt)
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
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.");
}
}
}
TestDBZugriffArtikel1 (Quellcode)19.2.2 Den zu einer Artikelnummer gehörenden Artikel laden
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
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;
}
//...
}
DBZugriffArtikel (Ausschnitt)
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
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 +"'.");
}
}
}
TestDBZugriffArtikel2 (Quellcode)19.2.3 Prüfen, ob eine Artikelnummer bereits vergeben ist
Aufgabe 19-7: istArtNrVergeben(pArtNr: String): boolean
Erstellen Sie in der Klasse DBZugriffArtikel die Methode istArtNrVergeben(pArtNr: String): boolean.
Lösung
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;
}
//...
}
DBZugriffArtikel (Ausschnitt)19.2.4 Einen neuen Artikel erfassen
Aufgabe 19-8: erfasseNeuenArtikel(pArtikel: Artikel): boolean
Erstellen Sie in der Klasse DBZugriffArtikel die Methode erfasseNeuenArtikel(pArtikel: Artikel): boolean.
Lösung
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;
}
//...
}
DBZugriffArtikel (Ausschnitt)
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
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.");
}
}
}
}
TestDBZugriffArtikel3 (Quellcode)19.2.5 Die Daten eines vorhandenen Artikel ändern
Aufgabe 19-10: aendereArtikel(pArtikel: Artikel): boolean
Erstellen Sie in der Klasse DBZugriffArtikel die Methode aendereArtikel(pArtikel: Artikel): boolean.
Lösung
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;
}
//...
}
DBZugriffArtikel (Ausschnitt)
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
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.");
}
}
}
TestDBZugriffArtikel4 (Quellcode)19.2.6 Die Daten eines Artikels löschen
Aufgabe 19-12: loescheArtikel(pArtNr: String): boolean
Erstellen Sie in der Klasse DBZugriffArtikel die Methode loescheArtikel(pArtNr: String): boolean.
Lösung
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;
}
//...
}
DBZugriffArtikel (Ausschnitt)
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
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.");
}
}
}
TestDBZugriffArtikel5 (Quellcode)