faecher:informatik:oberstufe:datenbanken:projekt:java_db:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:datenbanken:projekt:java_db:start [31.03.2025 17:09] – [Erstes Beispiel] Frank Schiebelfaecher:informatik:oberstufe:datenbanken:projekt:java_db:start [03.04.2025 19:53] (aktuell) – [Projektvorschläge] Frank Schiebel
Zeile 1: Zeile 1:
 +~~NOTOC~~
 +
 ====== Datenbankzugriff mit Java ====== ====== Datenbankzugriff mit Java ======
  
Zeile 14: Zeile 16:
 Java verwendet hier **JDBC ("Java Database Connectivity")**, für JDBC gibt es Treiber für alle gängigen DMBS. Wir verwenden zunächst SQlite als DMBS, da man dafür keinen gesonderten Datenbankserver benötigt - die Datenbanken liegen bei SQLite einfach als Dateien vor. Java verwendet hier **JDBC ("Java Database Connectivity")**, für JDBC gibt es Treiber für alle gängigen DMBS. Wir verwenden zunächst SQlite als DMBS, da man dafür keinen gesonderten Datenbankserver benötigt - die Datenbanken liegen bei SQLite einfach als Dateien vor.
  
-===== Erstes Beispiel ===== +===== Einführung =====
- +
-Im ersten Beispiel werden wir ohne grafische Benutzerschnittstelle (GUI) auf eine SQLite Datenbank zugreifen, um uns zunächst auf die Datenbankfunktionalität zu konzentrieren. +
- +
-[[https://codeberg.org/info-bw-wiki/bluej-db-adressen|Du findest das BlueJ-Projekt auf Codeberg]]. Klone das Projekt mit git - du benötigst später auch die anderen Branches. ''git clone https://codeberg.org/info-bw-wiki/bluej-db-adressen''. Öffne es mit BlueJ. +
- +
-Das Beispiel bringt eine SQLite Datenbank ''schueler.db'' mit. +
- +
----- +
-{{:aufgabe.png?nolink  |}} +
-=== (A1) === +
- +
-Untersuche die Datenbank, indem du die Datei mit dem [[https://sqlitebrowser.org/|DB Browser for SQLite]] öffnest. Notiere für die Schülerdatenbank die Namen der Tabelle(n) sowie Namen und Typen der Attribute.  +
- +
-++++ Lösung | +
-  * Die Schülerdatenbank hat nur eine Tabelle, diese heißt ''schueler''.  +
-  * Als Spalten/Attribute finden sich ''SVorname'', ''SNachname'', ''SGeschlecht'', ''SEmail'' (alle vom Typ ''varchar''),  ''SGeburtsdatum'' (Typ ''date'') und ''SKlasse'' (Typ ''integer'').   +
-++++ +
- +
-==== Bibliotheken einbinden ==== +
- +
-Die Bibliotheken für den Datenbankzugriff befinden sich im Unterverzeichnis ''+libs'' des BlueJ Projekts. Es sind die Bibliotheken für mysql und sqlite im Projekt dabei: ''mysql-connector-java-8.0.29.jar'' und ''sqlite-jdbc-3.49.1.0.jar''+
- +
-Der Ordner ''+libs''' ist bei PlueJ Projekten automatisch im Suchpfad für Bibliotheksfunktionen - um auf SQL Datenbanken zuzugreifen kann man am Beginn der Java-Klassendatei die nötigen Bibliotheken importieren und diese werden dann gefunden: +
- +
-<code> +
-import java.sql.Connection; +
-import java.sql.DriverManager; +
-import java.sql.Statement; +
-import java.sql.ResultSet; +
-import java.sql.SQLException; +
-</code> +
- +
-Das sieht so ähnlich aus, wie wenn wir Array-Lists verwenden wollen, nur dass die Bibliothektsfunktionen für SQL eben nicht (wie ArrayList) mit Java "mitgeliefert" werden, sondern gesondert in ''+libs'' zur Verfügung gestellt werden. +
- +
-Der gesamte Code sieht so aus: +
- +
-<code java> +
-import java.sql.Connection; +
-import java.sql.DriverManager; +
-import java.sql.Statement; +
-import java.sql.ResultSet; +
-import java.sql.SQLException; +
- +
-public class Adressen +
-+
-    Connection DBConnection; +
-    public Adressen() +
-    { +
-        System.out.print('\u000C'); +
-        String uri = "jdbc:sqlite:schueler.db"; +
-        connect(uri); +
-         +
-        try { +
-            Statement statement = DBConnection.createStatement(); +
-            ResultSet result = statement.executeQuery("SELECT * FROM schueler"); +
-            while(result.next()) { +
-                String nachname = result.getString("SNachname"); +
-                String vorname = result.getString("SVorname"); +
-                System.out.print(String.format("%-12s", nachname) + "\t"); +
-                System.out.print(String.format("%-12s", vorname) + "\t"); +
-                System.out.println(); +
-            } +
-        } catch (SQLException e) { +
-            System.out.println(e.getMessage()); +
- +
-        } +
- +
-    } +
-     +
-    public void connect(String DBUri) { +
-        try { +
-            DBConnection = DriverManager.getConnection(DBUri); +
-            System.out.println("Verbindung mit " + DBUri + " erfolgreich hergestellt"); +
- +
-        } catch (SQLException e) { +
-            System.out.println(e.getMessage()); +
-        } +
-    } +
-+
- +
-</code> +
- +
-==== Fehlerbehandlung ==== +
- +
-Alle Datenbankoperationen müssen in ''try''-''catch''-Blöcken ausgeführt werden. Das ist ein Mechanismus zur **Fehlerbehandlung**, im Code kann man gut erkennen, was dabei passiert. Zunächst wird im ''try''-Block die gewünschte Operation programmiert. Wenn diese fehlerfrei dürchgeführt wird, wird der ''catch''-Block übersprungen. Tritt jedoch bei den Operationen im ''try''-Block ein Fehler auf, etwas weil das SQL-Statement fehlerhaft ist, eine Datenbank oder Tabelle nicht existiert o.ä. wird der ''catch''-Block ausgeführt. Im einfachsten Fall, so wie hier, wird einfach der Fehler ausgegeben. +
- +
----- +
-{{:aufgabe.png?nolink  |}} +
-=== (A2) === +
- +
-Compiliere das Programm und erzeuge eine Instanz der Klasse ''Adresse''. Mach dir klar, was auf der Java Konsole ausgegeben wird. Informiere dich selbst über die ''String.format()'' Methoden und mach dir klar, was sie in unserem Beispiel machen, einen [[https://mkyong.com/java/java-string-format-examples/|Einstieg findest du hier]].  +
- +
-baue Fehler ein und teste, wie sich das Programm verhält: +
- +
-  * Ändere den Dateiverweis ''jdbc:sqlite:schueler.db'', der auf die Datenbank ''schuler.db'' zeigt so ab, dass die Datei nicht existiert - an welcher Stelle des Ablaufs tritt ein Fehler auf? +
-  * Baue Fehler in die SQL-Abfrage in Zeile 18 ein +
-  * Probiere weitere Fehler aus. +
- +
-<callout type="warning" icon="true"> +
-Hier erkennt man, warum die Fehlerbehandlung wichtig ist: Der Java Compiler weiß nichts über deine Datenbanken, er kann beim übersetzen des Programmcodes also auch in keiner Weise beurteilen, ob das Programm im Zusammenspiel mit der angesprochenen Datenbank sinnvolle Ergebnisse liefert - das muss alles die Programmiererin sinnvoll gestalten!  +
-</callout> +
- +
-==== Datenbankzugriff Schritt für Schritt ==== +
- +
-Der Zugriff auf die Datenbank erfolgt in mehreren Schritten: +
- +
-  * Datenbankverbindung herstellen +
-  * Auf dieser Verbindung ein ''Statement'' oder ein ''Prepared Statement'' instanziieren +
-  * Mit Hilfe des Statements kann eine SQL Abfrage an die Datenbank gesendet werden +
-  * Das Ergebnis ist vom Typ ''ResultSet'' und kann mit Hilfe eines Iterators verarbeitet werden. +
- +
-{{ :faecher:informatik:oberstufe:datenbanken:projekt:java_db:abfrage.png |}} +
- +
- +
-=== Am Beispiel: === +
- +
-  * Die Klasse hat ein Attribut ''DBConnection''. In der NMethode ''connect(String DBUri)'' wird versucht, eine Vebindung zu der in der Variablen ''DBUri'' übergebenen Datenbank herzustellen. Wenn das gelingt, ist der erste Schritt abgeschlossen, über ''DBConnection'' besteht jetzt eine Verbindung zur Datenbank. +
-  * Unter Verwendung dieser Verbindung kann jetzt ein Objekt des Typs ''Statement'' erzeugt werden: +
-<code java> +
-Statement statement = DBConnection.createStatement(); +
-</code> +
-  * Auf diesem ''Statement''-Object kann jetzt eine Abfrage ausgeführt werden, wobei das Ergebnis vom Typ ''ResultSet'' ist: +
-<code java> +
-ResultSet result = statement.executeQuery("SELECT * FROM schueler"); +
-</code> +
-  * Über die Elemente des ResultSets kann mit einem Iterator iteriert werden, das entspricht in etwa einem "foreach" für die Zeilen des Abfrageergebnisses: +
-<code java> +
-while(result.next()) { +
- +
-+
-</code> +
- +
-  * Der Zugriff auf die Spalten eines Ergebnis-Datensatzes kann entweder über den Feldnamen oder die laufende Nummer((Startet bei 1...)) erfolgen: +
- +
-<code java> +
-String nachname = result.getString("SNachname"); +
-Integer klasse = result.getInt("SKlasse"); +
-</code> +
- +
-<callout type="warning" icon="true"> +
-Hier muss die Programiererin wieder genau aufpassen und das Programm passend zur Datenbank programmieren: Die abgefragten Datenbankfelder haben innerhalb der Datenbank einen Daten-Typ. z.B. ''varchar(60)'', also eine Zeichenkette mit bis zu 60 Zeichen. Wenn man diese Felder in eine Java-Variable ausliest, muss die Java-Variable die gelesenen Werte auch speichern können, im Falle des ''varchar''-Attributs sollte also ein String verwendet werden und zum Auslesen die Methode ''result.getString(...)''  +
- +
-Als Variablentypen sollten auch bei den primitiven Datentypen wie ''int'', ''char'' die [[faecher:informatik:oberstufe:java:algorithmen:assoziative_arrays:start#anmerkung_zu_wrapper-klassen|Wrapper-Klassen]] verwendet werden - also ''Integer'' oder ''Character''+
-</callout> +
- +
-Einen Überblick über die Methoden findest du in der Java-Dokumentation: https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/ResultSet.html +
----- +
-{{:aufgabe.png?nolink  |}} +
-=== (A3) === +
- +
-Ergänze das Programm so, dass außer Nach- und Vorname der Schülerinnen auch die Klasse abgefragt und ausgegeben wird. Verwende für die Abfrage der Klasse als Java-Variablentyp ''Integer'' und als Methode ''result.getInt(...)''. Gib zwei weitere Spalten aus, einmal die Klasse in diesem Schuljahr und um eins erhöht die Klasse des kommenden Schuljahrs.+
  
-{{ :faecher:informatik:oberstufe:datenbanken:projekt:java_db:pluseins.png |}}+Die Beispiele Verwenden ''git'' um zwischen Branches zu wechseln. Du solltest also sicherstellen, dass du die [[faecher:informatik:oberstufe:git:start|Grundlagen der Versionsverwaltung mit git]] verstanden hast und git auf deinem Arbeitsgerät installiert ist.
  
-++++ Lösungsvorschlag +  * [[.java_db_schuelerliste:start|Schritt 1: Schülerliste komplett auslesen]] 
-<code java> +  * [[.java_db_schuelerliste_suche:start|Schritt 2: Suchen in der Schülerliste]
-[....+  * [[.java_db_schuelerliste_insert:start|Schritt 3: Daten in die Schülerliste einfügen]] 
-while(result.next()) { +  * [[.java_db_null:start|Schritt 4: Verarbeitung von Null-Werten]
-                String nachname = result.getString("SNachname"); +
-                String vorname = result.getString("SVorname"); +
-                Integer klasse = result.getInt("SKlasse"); +
-                System.out.print(String.format("%-12s", nachname) + "\t"); +
-                System.out.print(String.format("%-12s", vorname) + "\t"); +
-                System.out.print(klasse + "\t"); +
-                System.out.print(klasse + 1 + "\t"); +
-                System.out.println(); +
-            } +
-[....] +
-</code> +
-+++++
  
----- +===== Projektvorschläge =====
-{{:aufgabe.png?nolink  |}} +
-=== (A4) ===+
  
-Ändere den Code aus Aufgabe 3 so ab, dass du die KLasse in eine Java-Variable des Typs ''String'' ausliest und dazu die Methode ''result-getString(...)'' verwendest, lass den restlichen Code unverändert. Was fällt dir auf?+  * [[.java_db_p_tagebuch:start|Ein Tagebuch]] 
 +  * [[.java_db_p_mondial:start|Geoinformationsdaten]] 
 +  * [[.java_db_p_adressbuch:start|Adressbuch]]
  
-++++ Lösungshinweis | +===== Material ===== 
-Da das Feld jetzt als String ausgelesen wird, verkettet Java das auch als String, es wird nicht mehr korekt addiert. Wenn man nicht auf die korrekte Passung der Datentypen achtet, können seltsame Dinge geschehen. + 
-{{ :faecher:informatik:oberstufe:datenbanken:projekt:java_db:stringverk.png |}} +
-+++++
  
----- +[[https://slides.info-bw.de/fs-wiki-java-db-01/|PräsentationStart-Präsentation: DB Zugriff mit Java]] [[https://slides.info-bw.de/fs-wiki-java-db-01/?print-pdf|(PDF)]]((Link öffnen, dann aus dem Browser in ein PDF drucken)
-{{:aufgabe.png?nolink  |}} +
-=== (A5===+
  
-Was passiert, wenn du versuchst, den Vor oder Nachnamen in eine Java-Variable des Typs ''Integer'' auszulesen?+----  
 +Die Materialien und Inhalte des Bereichs "Datenbanken mit Java" basieren auf Ideen und der Vorarbeit von R. Helfrich. Insbesondere die Projektvorlagen zum Üben und Ausprobieren wurden von ihm erstellt.  Alle Fehler, die sich bei der Ergänzung und Übernahme ins Wiki eingeschlichen haben gehen auf meine Kappe ;)
  
-++++ Lösungshinweis | 
-{{ :faecher:informatik:oberstufe:datenbanken:projekt:java_db:nullwerte.png |}} 
-++++ 
  • faecher/informatik/oberstufe/datenbanken/projekt/java_db/start.1743440973.txt.gz
  • Zuletzt geändert: 31.03.2025 17:09
  • von Frank Schiebel