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 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 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 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 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 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 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 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 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 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 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)