Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 7. Design und Datenbanken 21. Mai 2002 Ziel • Grundbegriffe aus ERM, SQL, JDBC, EJB-Entity Beans kennenlernen • Verständnis dafür, wie eine relationale Datenbank angesteuert werden kann • Einige zentrale Mechanismen der Software-Architektur im DB Umfeld kennen („Transaktionen“) 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -2- 1 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Motivation • Ohne „Datenhaltung“ fehlt uns was • Was bedeutet eigentlich Datenmodellierung? • Wie kann das in die Systemarchitektur und – Konzeption eingebracht werden? – Separation der Datenhaltung (→ Architektur) – Allgemeine Sprache: SQL • Notwendigkeit: Zugriff auf DB aus einem Programm heraus – Database-APIs, um DB in Java,.. anzusprechen – SQL-Kommandos automatisch erzeugen und ausführen (statt im Dialog) 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -3- Agenda • • • • • Modellbildung ERM SQL JDBC Entity Beans (Daten als Komponenten) Web-Server Web-Client 21. Mai 2002 Dr. Walter Kuhn Servlets JSP EJB Oder Java Bean JDBC Einführung ins Software Engineering - Design und Datenbanken DB -4- 2 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Grundbegriffe im ER-Modell • Entität / entity – individuelles, identifizierbares Exemplar – beschrieben durch Eigenschaften – Vergleiche mit Objekt ! • Entitätsmenge / entity set – Zusammenfassung von Entitäten mit gleichartigen Eigenschaften – Name (Substantiv) als Oberbegriff für alle Entitäten der Menge – Vergleiche mit einer Klasse, auch genannt „Objekttyp“ o. „Entitätstyp“ • Attribut / attribut, property – – – – Eigenschaft von allen Entitäten einer Entitätsmenge Name entsprechend fachlicher Bedeutung vorgegebener Wertebereich (auch „Domäne“ domain) beschreibende / identifizierende Attribute 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -5- Grundbegriffe im ER-Modell (2) • Schlüssel / key – minimale identifizierende Attributkombination – mehrere Schlüssel möglich → Primärschlüssel wählen (Notation: oft Unterstrichen) • Assoziation / relationship – Zusammenfassung von gleichartigen Beziehungen zwischen Entitäten – Name (Verbform) als Oberbegriff für die gleichartigen Relationen zwischen den Entitäten zweier Entitätsmengen – kann ebenfalls Attribute haben • Kardinalität – Quantifiziert die Auftrittshäufigkeit von Entitäten in einer Assoziation – Schreibweise • X:Y in der MC-Notation (Multiple, Choice) • (min1,max1) : (min2,max2) in der numerischen Notation 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -6- 3 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Entity-Relationship-Modell – 1:1 bzw. 1:C – Assoziationen Entitätsmenge Person Entitätsmenge ID-Ausweis Charlie Brown ID:BC-USA-1234567890 ID:CK-Krypton-dfwurh3948 Clark Kent IDJB007shakennotstirred James Bond 1:1 : der Entitiät „James Bond“ wird (in diesem Beispiel) eindeutig der Ausweis mit der Bezeichnung „ IDJB007shakennotstirred“ zugeordnet. 1:C : einer Entität wird genau ein oder gar kein Ausweis zugeordnet (Conditional) Graphische Darstellung (ER-Notation) Person 21. Mai 2002 1 1 Gehört zu 1 IdentitätsC ausweis Einführung ins Software Engineering - Design und Datenbanken -7- Entity-Relationship-Modell – 1:N bzw. 1:NC – Assoziationen Entitätsmenge Person Entitätsmenge Bankkonto Charlie Brown 01234-987654321 2468-ab1234568764 545127780944 987345102938 8492730123456aq Clark Kent James Bond 1:N : der Entitiät „James Bond“ wird (in diesem Beispiel) mehrere (≥ 1 ) Bankkonten zugeordnet. Allen Konto jedoch ist gemein, genau einen Besitzer zu haben. 1:NC: jede Person kann ein oder mehrere Konten haben, oder auch keines. Ein Konto ist aber eindeutig einer Person zugeordnet Graphische Darstellung (ER-Notation) Person 21. Mai 2002 Dr. Walter Kuhn 1 1 besitzt N NC Bankkonto Einführung ins Software Engineering - Design und Datenbanken -8- 4 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Entity-Relationship-Modell – N:M bzw. NC:MC – Assoziationen Entitätsmenge Person Entitätsmenge Bank Charlie Brown First Credit myBank Krypton Worth Bermudas Best European National Bank Clark Kent James Bond M:N bedeutet hier: jede Entität Person kann Kunde bei mehreren (≥ 1) Banken sein, die Ihrerseits jeweils mehrere (≥ 1) Kunden haben können. M:NC jede Person kann eine, mehrere oder auch keine Bankbeziehung haben. MC:NC: ditto, ausserdem gibt es auch Banken ohne Kunden Graphische Darstellung (ER-Notation) Person 21. Mai 2002 M M MC Kundenbeziehung N Bank NC NC Einführung ins Software Engineering - Design und Datenbanken -9- Entity-Relationship-Modell – Kardinalitäten Menge 2 Menge 1 muss kann 21. Mai 2002 Dr. Walter Kuhn 1 M C MC muss 1 1:1 M:1 C:1 MC:1 N 1:N M:N C:N MC:N kann C 1:C M:C C:C MC:C Einführung ins Software Engineering - Design und Datenbanken NC 1:NC M:NC C:NC MC:NC -10- 5 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Kardinalitäten von Assoziationen – Alternative Darstellungen • ACHTUNG: numerische Notation wird umgekehrt gelesen wir NC Notation • Beispiel 1: ein A hat 0 bis viele (n) B. Ein B hat genau ein A. A A 1 NC (0,n) (1,1) M N (1,n) A B (1,m) M C (0,1) 21. Mai 2002 B B (1,m) Einführung ins Software Engineering - Design und Datenbanken -11- Entity-Relationship-Modell – Vergleich Kantennotationen MC Notation Numerische Notation C (0,1) A B A B 1 (1,1) A B A B MC (0,n) A B A B M (1,n) A B A B 21. Mai 2002 Dr. Walter Kuhn KrähenfussNotation Pfeil-Notation Einführung ins Software Engineering - Design und Datenbanken -12- 6 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Rekursive Assoziationen • Entitätsmenge in Beziehung mit sich selbst – Diagramm: um Rollennamen erweitert – Jede Person kann 0 bis m Kinder haben – Jedes Kind hat einen Vater Kind MC ist Vater von Person 1 Vater 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -13- Erweiterung des ERM: semantische Modellierung (1) • Aggregation – – – – Assoziation, die Über-/Unterordnung beschreibt meist „ist-Teil-von“ ("is-part-of ") Verknüpft Entitäten Bsp: Motor kann in Auto eingebaut sein, oder (noch) nicht Auto C part-of part-of 1 M Motor 21. Mai 2002 Dr. Walter Kuhn C Rad C part-of 1 Karosserie Einführung ins Software Engineering - Design und Datenbanken -14- 7 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Erweiterung des ERM: semantische Modellierung (2) • Generalisierung – – – – Assoziation, die Hierarchie modelliert Verknüpft Entitätsmengen meist „ist-ein“ ("is-a") Attribute werden vererbt, weitere Attribute kommen hinzu Person is-a Kunde 21. Mai 2002 Generalisierungstyp is-a Spezialisierungstypen Dozent Einführung ins Software Engineering - Design und Datenbanken -15- Entity-Relationship-Modell – Bewertung Positiv • Einfache, graphische Form • CASE Tools unterstützen Abbildung auf Datenbanken • Recht universell anwendbar • Standard! Negativ • Keine Hierarchisierung bzw. Verfeinerung von Datenobjekten (Unübersichtlich) • Unterschied Entity versus Relationship scheint willkürlich • Wann ist ein Datenmodell abgeschlossen? • Umgang mit komplexen Datenmodellen? Bemerkung: man kann ERM mit UML realisieren bzw. abbilden! Genug modelliert – jetzt wird tabelliert! 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -16- 8 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Tabellendarstellung • Jede Entitätsmenge wird zu einer Tabelle • Jede Entität wird zu einem Tabelleneintrag (Zeile) • Kurzname ist der Primärschlüssel, muss eindeutig sein Person Kurzname wkuhn srizotti ... 21. Mai 2002 Name Walter Kuhn Sven Rizotti ... Adresse Meine Strasse 99,... Dein Weg 20,... ... Einführung ins Software Engineering - Design und Datenbanken -17- Tabellendarstellung (2) • Jede 1:1- oder M:1 -Assoziation zwischen A und B wird als zusätzliches Attribut in A eingetragen – zusätzliches Attribut muß in B ein Schlüssel sein = “Fremdschlüssel” Person (B) 1 hat M Konto (A) Konto KontoNr Wert Kurzname 0815 42 wkuhn 4711 101 wkuhn 2105 9999 srizotti 21. Mai 2002 Dr. Walter Kuhn Fremdschlüssel aus Person Einführung ins Software Engineering - Design und Datenbanken -18- 9 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Tabellendarstellung (3) • Jede M:N-Assoziation zwischen A und B wird durch eine eigene Tabelle dargestellt – Paare aus Schlüsseln zu A und zu B – weitere Attribute möglich Student M N besucht Vorlesung besucht MatrikelNr 10 10 27 ... 21. Mai 2002 VorlesungsNr 94 22 37 ... TestatVom 01.01.2002 01.04.2002 24.05.2002 ... Einführung ins Software Engineering - Design und Datenbanken -19- Entity-Relationship-Modell – CRUD Matrix Daten Kunde Konto Firma Zahlungsverzug …. Funktionen Erfasse Kundenstamm c Aktualisiere Kundenstamm u Lösche Kundenstamm d Erstelle Adressaufkleber r Erstelle Kontoauszug r Create Read Update Delete [Balz96] Dr. Walter Kuhn 21. Mai 2002 r r Hilfreich für Überlegungen, welche Daten mit welchen Funktionen / Methoden wie bearbeitet werden sollen Einführung ins Software Engineering - Design und Datenbanken -20- 10 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Agenda • • • • • Modellbildung ERM SQL JDBC Entity Beans (Daten als Komponenten) Web-Server Web-Client 21. Mai 2002 Servlets JSP EJB Oder Java Bean JDBC Einführung ins Software Engineering - Design und Datenbanken DB -21- SQL • SQL – Sprache für Datendefinition, -manipulation, -schutz – Basis: Relationenmodell (Begriffe Relation, Tupel, Tabelle,.. bekannt) – nichtprozedural: Eine Anfrage beschreibt die Bedingung, die erfüllt sein muß, damit ein Datenelement zur Antwortmenge gehört – mengenorientiert: Eine Anfrage liefert eine Menge von Tupeln zurück. – Definition der Sprache durch Standards: SQL-86, SQL-92 („SQL-2“); SQL-99 • Wie nun mit den Tabellen umgehen – Erzeugen → DDL – Data Description Language – Daten einfüllen, ändern, löschen → DML – Data Manipulation Language – … • DBMS haben meist – Eine Kontrollinstanz, in die SQL eingegeben werden kann – Ein (oder mehrere) API´s, um dasselbe per Software zu tun 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -22- 11 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 SQL – wichtigste Kommandos • Data Definition Language (DDL) – ALTER INDEX, ALTER SEOUENCE, ALTER TABLE, – CREATE INDEX, CREATE SEOUENCE, CREATE SYNONYM, CREATE TABLE, CREATE VIEW, – DROP INDEX, DROP SEQUENCE, DROP SYNONYM, DROP TABLE, DROP VIEW, – GRANT, REVOKE • Data Manipulation Language (DML) – DELETE, INSERT, LOCK TABLE, SELECT, UPDATE • Transaction Control Kommando – COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION • Session Control Kommando – ALTER SESSION 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -23- SQL DDL Create • Erzeuge DB CREATE DATABASE <db_name> ; • Erstelle (Lösche) Tabelle CREATE TABLE <table_name> ( <column1_name> <column1_type> <column1_constraint>, <comumn2_name> <column2_type> <column2_constraint>, ... ); DROP TABLE <table_name> ; – Jede Spalte benennen, Datentyp festgelegen – Spaltenconstrainsts sind z.B. Dr. Walter Kuhn • • • • Festlegung des Primärschlüssels [PRIMARY KEY] Verbieten von Doppelnennung [UNIQUE] Verbieten des NULL-Wertes [NOT NULL] Defaultwerte (Wert oder Autoinkrementierung). 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -24- 12 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 SQL DML Select (1) • SELECT … FROM … WHERE .. Order By … ; • SELECT – wähle Menge von Spalten (* = alle) oder abgeleitete Spaltenwerte • FROM – wählt eine Tabelle oder eine Liste von Tabellen • WHERE – wählt bestimmte Zeilen • ORDER BY – sortiert die Ausgabe 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -25- SQL DML Select (2) • Selektion: Auswahl bestimmter Tupel (Zeilen) Select * from Table1 where NAME=„meier“; • Projektion: Auswahl bestimmter Spalten Select TOTAL from Table1; • Kombination sind auch möglich Select Anrede, Name, Vorname from Person where PersonalNr in ( Select PersonalNr from Student Union Select PersonalNr from Dozent); 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -26- 13 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 SQL DML Insert • Einfügen INSERT [INTO] <table> [(column_name,...)] VALUES (expression,...); • Beispiel CREATE TABLE mitarbeiter ( id INT PRIMARY KEY, vname VARCHAR(15), nname VARCHAR(30), gdate DATE, gehalt FLOAT, plz INT, str VARCHAR(30) ); INSERT INTO mitarbeiter VALUES( 007, 'James', 'Bond', '1952-03-02', 1600000, 33600, 'Goldfingerweg 17') ; 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -27- SQL DML Update • Zeilen ändern: UPDATE .. SET UPDATE <table> SET column_name1=expression1 [,...] [WHERE ...]; • Beispiel UPDATE mitarbeiter SET nname='Einstein', plz=12345 WHERE id=0816; UPDATE mitarbeiter SET gehalt = gehalt * 1.03; UPDATE mitarbeiter SET gehalt = 1000 WHERE gehalt IS NULL; 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -28- 14 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 SQL DML Delete • Zeilen löschen DELETE FROM <table> [WHERE ...]; • Beispiel DELETE FROM mitarbeiter WHERE id=4711; 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -29- Technische Schnittstellen für SQL in API´s • ODBC – Open DataBase Connectivity, – Microsoft: C-Schnittstelle, begrenzt auf MS-Windows • JDBC – Java DataBase Connectivity, Sun Microsystems – Java-Schnittstelle, Anschluß an DB direkt oder mittelbar über ODBC • Embedded SQL – Mischprogramm aus C- und SQL-Statements, wird in zwei Stufen übersetzt • Datenbank- und Programmiersprachen-spezifische Schnittstellen – Beispielsweise "libpq" für Postgres: C-Library, begrenzt auf Postgres 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -30- 15 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Agenda • • • • • Modellbildung ERM SQL JDBC Entity Beans (Daten als Komponenten) Web-Server Web-Client Servlets JSP 21. Mai 2002 EJB Oder Java Bean JDBC DB Einführung ins Software Engineering - Design und Datenbanken -31- Java Database Connectivity (JDBC) • API Spezifikation März 1996 • Basiert auf X/Open SQL-Call Level Interface • API zur Anbindung relationaler Datenbanken – DB-DDL&DML ist SQL – – – – Konkrete Implementierung als Klasse laden Verbindung zur DB herstellen SQL Befehle absetzen Auswertung der Ergebnisse DB-Client JDBC Driver • 4 JDBC-Treibertypen 1. JDBC-ODBC-Bridge (für ODBC fähige DB) 2. plattformeigene JDBC-Treiber 3. universelle JDBC-Treiber 4. direkte JDBC-Treiber 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -32- 16 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 JDBC (Scope JDBC 2.0) • Packages – Kern-Klassen: java.sql – Java Standard Extensions: javax.sql • JDBC Core – Muss von allen JDBC Treibern implementiert sein – Umfassen 90% der Interaktionen mit DB – JDBC Metadata: Informationen über DB selber • JDBC Java Language Extensions & Utilities – Datentypen Brücke zwischen SQL und Java – Datums- und Zeithandling – Ausnahmen 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -33- JDBC API 3.0 Specification Final Release (von Sun-Website) • JDBC API v. 3.0 is included in J2SE 1.4. • The JDBC Optional Package will be packaged with the core API and be included as part of J2SE. • Other major changes include: – Connection Pool configuration enhancements – Statement pooling for Pooled Connections – description of the migration path from the JDBC SPI (Service Provider Interface) to the Connector Architecture. – The latest SDK includes a JDBC-ODBC Bridge driver that makes most Open Database Connectivity (ODBC) drivers available to programmers using the JDBC API. 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -34- 17 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 java.sql Package (Basis JDBC 2.0) • Aufbau einer Verbindung zu einer Datenbank – DriverManager class verwaltet (mehrere) JDBC-Treiber & verteilt ConnectionObjekte – Driver interface: jeder JDBC Hersteller muss diese Methoden implementieren – DriverPropertyInfo class: Eigenschaften und ihre momentane Belegungen – Connection interface: Ein Connection Objekt verwaltet • Sitzung, definiert eine Umgebung für SQL-Anweisungen und ihre Ergebnisse. • Informationen über Zustand der verbundenen DB (getMetaData() → DatabaseMetaData) • createStatement-Methode erzeugt ein Statement-Objekt • Aufruf von SQL statements – Statement interface: Senden von SQL Anweisungen, Verwaltung der Ergebnisse – PreparedStatement interface: Objekt dient als Container für eine vorkompilierte, mehrfach anwendbare SQL-Anweisung – CallableStatement interface: Aufruf von stored procedures aus der DB • • • • Datenbank Ergebnisse (und Update) mit Cursor: ResultSet interface Meta-Informationen über Ergebnismenge: ResultSetMetaData interface Meta-Informationen über Datenbank: DatabaseMetaData interface Providing security : SQLPermission interface 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -35- java.sql Package (Basis JDBC 2.0) • • • Mapping an SQL value to the standard mapping in the Java programming language – Array interface – Blob interface – Clob interface – Date class – Ref interface – Struct interface – Time class – Timestamp class – Types class Custom mapping an SQL user-defined type to a class in the Java programming language – SQLData interface – SQLInput interface – SQLOutput interface Throwing exceptions – SQLException thrown by most methods when there is a problem accessing data and by some methods for other reasons – SQLWarning thrown to indicate a warning – DataTruncation thrown to indicate that data may have been truncated – BatchUpdateException: indicates that not all commands in a batch update executed successfully 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -36- 18 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Package javax.sql • Interface Summary – – – – – – – – – – – – • ConnectionEventListener: register to receive events generated by a PooledConnection. ConnectionPoolDataSource object is a factory for PooledConnection objects. DataSource object is a factory for Connection objects. PooledConnection object is a connection object that provides hooks for connection pool management. RowSet adds support to the JDBC API for the JavaBeans(TM) component model. RowSetInternal object presents itself to a reader or writer as an instance of RowSetInternal RowSetListener is implemented by a component that wants to be notified when a significant event happens in the life of a RowSet RowSetMetaData extends ResultSetMetaData to allow a metadata object to be initialized. RowSetReader An object implementing the RowSetReader interface may be registered with a RowSet object that supports the reader/writer paradigm. RowSetWriter An object that implements the RowSetWriter interface may be registered with a RowSet object that supports the reader/writer paradigm. XAConnection object provides support for distributed transactions. XADataSource A factory for XAConnection objects. Class Summary – ConnectionEvent provides information about the source of a connection related event. – RowSetEvent is generated when something important happens in the life of a rowset, like when a column value changes. 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -37- Ablauf der Kommunikation mit einer JDBC DB 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -38- 19 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 1. Nutzung eines spezifischen DB-Drivers • Treiberdatei (*.zip, *.jar) in CLASSPATH aufnehmen • Treiber registrieren. Varianten – Aufruf der Java-Anwendung mit Parameter java -Djdbc.drivers=com.MyDB.myDriver JdbcClass – Explizites Laden der Treiber-Klasse, z.B. Class.forName ("com.MyDB.myDriver"); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); … – Objekt der Treiberklasse erzeugen & registrieren DriverManager.registerDriver( new com.MyDB.myDriver); 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -39- 2. Aufbau einer Datenbankverbindung java.sql.Connection • Datenbankverbindung vom DriverManager anfordern. Connection con = DriverManager.getConnection (String url,String username,String password); • url: Ort der DB • Syntax: <Protokoll>:<Subprotokoll>:<Subname> • Beispiele: – jdbc:odbc:registeredDB – jdbc:db2:localSample – jdbc:db2://server:1234/test ODBC-DB (Typ 1) lokale DB (Typ 2) remote DB (Typ 3,4) • username & password: Authentifizierung am DBMS 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -40- 20 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 3. Benutzung der DB java.sql.Statement und java.sql.ResultSet • Statement wird aus Connection erzeugt Statement stmt = con.createStatement(); • UDATE, INSERT, o.ä., mit SQL Syntax: int rc = stmt.executeUpdate ("CREATE TABLE table1 (NAME VARCHAR(32), TOTAL INTEGER)"); rc = stmt.executeUpdate ("INSERT INTO table1 VALUES ('abc',42)"); • Abfrage mit SELECT ergibt ResultSet Resultset rs = stmt.executeQuery („SELECT * FROM table1 "); • Rückgabetyp nicht bekannt => nutze boolean rc = stmt.execute (string_mit_Statement); 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -41- 4. Abfrage der Ergebnismenge • Cursor eines ResultsSet zeigt auf die jeweils bearbeitete Zeile – ResultSet setzt Cursor beim Erzeugen vor ersten Datensatz – Iterieren zum nächsten Datensatz mit boolean rs.next(); • Auslesen eines Attributes eines Datensatz mit getXXX(); • Beispiel (Tabelle von vorher) int zahl = rs.getInt (1); // Spaltenindex String name = rs.getString ("name"); // Spaltenname // Auslesen einer Tabelle while (rs.next()) { name = rs.getString(1); zahl = rs.getInt(2); } • Typenumwandlung: Die meisten Java-Datentypen können in einen SQL-Typ gewandelt werden 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -42- 21 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Liste der getXXX operationen • • • • • • • • • TINYINT: getByte (recommended) , getShort, getInt, getLong, getFloat, getDouble, getBigDecimal, getBoolean, getString, getObject SMALLINT: getShort (recommended), getByte, getInt, getLong, getFloat, getDouble, getBigDecimal, getBoolean, getString, getObject INTEGER: getInt (recommended), getByte, getShort, getLong, getFloat, getDouble, getBigDecimal, getBoolean, getString, getObject BIGINT: getLong (recommended), getByte, getShort, getInt, getFloat, getDouble, getBigDecimal, getBoolean, getString, getObject REAL: getFloat (recommended), getByte, getShort, getInt, getLong, getDouble, getBigDecimal, getBoolean, getString, getObject FLOAT: getDouble (recommended), getByte, getShort, getInt, getLong, getFloat, getBigDecimal, getBoolean, getString, getObject DOUBLE: getDouble (recommended), getByte, getShort, getInt, getLong, getFloat, getBigDecimal, getBoolean, getString, getObject DECIMAL: getBigDecimal (recommended), getByte, getShort, getInt, getLong, getFloat, getDouble, getBoolean, getString, getObject NUMERIC: getBigDecimal (recommended), getByte, getShort, getInt, getLong, getFloat, getDouble, getBoolean, getString, getObject 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -43- Liste der getXXX operationen (2) • • • • • • • • • • BIT: getBoolean (recommended), getByte, getShort, getInt, getLong, getFloat, getDouble, getBigDecimal, getString, getObject CHAR: getString (recommended), getByte, getShort, getInt, getLong, getFloat, getDouble, getBigDecimal, getBoolean, getDate, getTime, getTimestamp, getAsciiStream, getUnicodeStream, getObject VARCHAR: getString (recommended), getByte, getShort, getInt, getLong, getFloat, getDouble, getBigDecimal, getBoolean, getDate, getTime, getTimestamp, getAsciiStream, getUnicodeStream, getObject LONGVARCHAR: getAsciiStream, getUnicodeStream (both recommended), getByte, getShort, getInt, getLong, getFloat, getDouble, getBigDecimal, getBoolean, getString, getDate, getTime, getTimestamp, getObject BINARY: getBytes (recommended), getString, getAsciiStream, getUnicodeStream, getBinaryStream, getObject VARBINARY: getBytes (recommended), getString, getAsciiStream, getUnicodeStream, getBinaryStream, getObject LONGVARBINARY: getBinaryStream (recommended), getString, getBytes, getAsciiStream, getUnicodeStream, getObject DATE: getDate (recommended), getString, getTimestamp, getObject TIME: getTime (recommended), getString, getTimestamp, getObject TIMESTAMP: getTimestamp (recommended), getString, getDate, getTime, getObject 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -44- 22 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 JDBC 2.0: scrollable cursors (1) • ResultSets mehrmals in beliebiger Richtung auslesen • Operationen beziehen sich auf aktuelle Zeile (Feldoperationen, Zeilenoperationen, Cursorbewegungen) eines ResultSet rs • Dazu muss Statement entsprechend erzeugt werden • Beispiel Statement stmt= con.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE) 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -45- JDBC 2.0: scrollable cursors (2) • JDBC 2.0 unterstützt ausser next() Bewegungen des Cursors – – – – – rs.beforeFirst(); // vor die 1. Zeile rs.afterLast(); // nach die letzte Zeile rs.previous(); // Rückwärts laufen rs.absolute(4); // cursor auf 4. Zeile rs.relative(-3); // cursor relativ 3 Z.zum Anfang • Positionsbestimmung – – – – rs.isFirst() rs.isLast() rs.isBeforeFirst() rs.isAfterLast() • Anzahl der Zeilen – rs.last(); rs.getRow() 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -46- 23 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 ResultSet Typen (wichtig fürs scrolling) • TYPE_FORWARD_ONLY – Cursor nur vorwärts – Je nach Implementation DBMS Änderungen in Daten sofort ersichtlich oder nicht • TYPE_SCROLL_INSENSITIVE – Scrollable Cursor – Änderungen in den Daten in der Regel nicht sofort ersichtlich • TYPE_SCROLL_SENSITIVE – Scrollable Cursor – Änderungen in den Daten werden sichtbar – Je nach Implementation bleibt Reihenfolge der Zeilen erhalten oder nicht • CONCUR_READ_ONLY – Einziger Typ in JDBC 1.0 API – Keine Updates möglich – Gute Performance • CONCUR_UPDATABLE – Seit JDBC 2.0 core API vorhanden – Updates möglich – Write-Locks - geringere Performace. Je nach DB nur 1 User 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -47- Streams für grosse Datenfelder • getXXX liefert Daten en bloc. Bis zu Statement.getMaxFieldSize grosse Felder sind LONGVARCHAR, LONGVARBINARY und seit JDBC 2.0 BLOB (Binary Large Object) und CLOB (Character LargeObject) • Der Zugriff kann auch über Streams erfolgen: – getBinaryStream: keinerlei Konversion. Reiner Bytestrom. – getAsciiStream: Ein-Byte ASCII-Zeichen. – getUnicodeStream: Zwei-Byte Unicode (deprecated, use getCharacterStream) – getCharacterStream (JDBC 2.0): liefert java.io.Reader mit Unicode, • unabhängig vom DB-Format 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -48- 24 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Nullwerte • Je nach get-Methode wird für NULL zurückgeliefert (0 != null) – null, wenn ein Java-Objekt zurückgeliefert wird: getString, getBytes, getDate, ... – 0, wenn eine Zahl zurückgeliefert wird: getByte, getShort, getInt, getLong, getFloat, getDouble – false bei getBoolean • Prüfung, ob SQL-NULL (Leeres Attribut eines Datensatzes): muss gefangen werden mit der Methode ResultSet.wasNull() name = rs.getString (1); if (rs.wasNull()) ... // Behandlung • Bemerkung: der Einsatz von Nullwerten bedeutet den Einsatz einer 3-wertigen Logik, die je nach Fall schwer zu durchschauen sein kann. Es ist sinnvoll, zu prüfen, ob statt dessen DefaultWerte nützlicher sind (NOT NULL). 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -49- Prepared Statement • Sohnklasse von Statement • Wird an DB geschickt, dort vorkompiliert und später an Parameter gebunden. Nutzen: bessere Performance bei mehrfachem Aufruf • Anweisung mit ‘?‘ parametrisiert PreparedStatement updateTable = con.prepareStatement ("UPDATE table1 SET total = ? WHERE NAME LIKE ? "); • Variablen binden. 1. Parameter ist Position des ersten ‘?‘ updateTable.setInt(1, 43); // TOTAL updateTable.setString(2, „xyz"); // NAME • Anweisung mit executeUpdate oder executeQuery ausführen updateTable.executeUpdate(); 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -50- 25 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 CallableStatement • Sohnklasse von PreparedStatement • Wird bei Stored Procedures verwendet . Es gibt Ein- und Ausgabeparameter • Stored Procedures laufen in der Datenbank => Performance • Erzeugung wie PreparedStatment CallableStatement stmt = con.CallableStatement ("CALL AFunc (?,?)"); • Bei Out-Parameter muss der SQL-Typ angegeben werden stmt.registerOutParameter (1, java.sql.Types.Integer); • Danach Out-Parameter auslesen mit int aTest = stmt.getInt(1); 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -51- DatabaseMetaData • Interface, über welches Infos über eine verbundene Datenbank abgefragt werden • Erzeugen eines Objekts aus einer Connection mit: DatabaseMetaData dbmd = con.getMetaData(); • Viele Methoden, um alle möglichen Informationen über die Datenbank auszulesen, z. B. getDatabaseProductName() getDriverVersion() getMaxStatements() supportsStoredProcedures() …. 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -52- 26 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 ResultsetMetaData • Interface, über das Informationen über ein AbfrageErgebnis abgefragt werden • Erzeugen eines Objekts aus einem Resultset mit: ResultsetMetaData rsmd = rs.getMetaData(); • Viele Methoden, um alle Informationen über das ResultSet auszulesen, z. B. int getColumnCount() String getColumnName(int column) int isNullable(int column) … 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -53- Transaktionen • Denken Sie an das Beispiel der Vorlesung (Tafelanschrieb) – 2 Konten mit einer Buchung von einem Konto auf das andere • Default: jedes SQL-Statement in eigenem Transaktionskontext • Prüfe die Art der Transaktionkontrolle boolean b = con.getAutoCommit(); • Aktivierte explizite, manuelle Transaktionskontrolle Connection.setAutoCommit(false) • Eine Transaktion startet implizit • Terminiere Transaktion Connection.commit() Connection.rollback() • Zusätzliche Methoden für Isolationslevel .. 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -54- 27 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Connection Pooling • Connections öffnen & schliessen ist teuer (Zeit, Systemresourcen) – Daher Connections wiederverwenden: Pool von Connections. Dort werden bei Bedarf Connections angefordert. – Die Rückgabe erfolgt durch die Methode close() der Connection • Der Connection-Manager ist die Klasse DataSource. Über diese Klasse Connections poolen. • Hinweis fürs Praktikum: Connection z.B. im init() eines Servlets realisieren, über die Threads geeigneter Zugriff 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -55- JDBC 2.0 – BATCH • Batch Jobs bei Statements: mehrere Statements als eine Einheit ausführen. Nutzen: Performance stmt = con.createStatement(); stmt.addBatch ("CREATE TABLE table1 (name varchar (32),<...>)"); // stmt.addBatch ("INSERT INTO table1 VALUES (‚ijk', 101)"); ... stmt.executeBatch(); • Geht auch bei PreparedStatement, dort werden die Parameter angegeben. • SQL-Statements müssen einfachen Update- Count zurückliefern • Nicht erlaubt: SELECT-Statements, die ResultSet zurückliefern • Batch-Updates optional für JDBC-Treiber → prüfe mit DatabaseMetaData.supportsBatchUpdates 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -56- 28 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 JDBC 2.0 – Updates über Methodenaufrufe • Vorbedingung stmt = con.createStatement ( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); • Updates können auch ohne SQL-Anweisungen über das ResultSet gemacht werden ResultSet.updateString(int columnIndex, String x) • Update wird mit updateRow() in die DB geschrieben • Ähnlich neue Zeilen eingefügen – ResultSet.moveToInsertRow() – ResultSet.updateString(...) – ResultSet.insertRow(); // schreiben! 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -57- JDBC Dokumentation • http://java.sun.com/products/jdk/1.3/docs/guide/jdbc/ • JDBC Seite von Sun. Dort ist auch die JDBC Extension erhältlich (javax.sql) – http://java.sun.com/products/jdbc/ • Tutorial von Sun: – http://java.sun.com/docs/books/tutorial/jdbc/basics/ – http://developer.java.sun.com/developer/Books/JDBCTutorial/ 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -58- 29 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Agenda • • • • • Modellbildung ERM SQL JDBC Entity Beans (Daten als Komponenten) Web-Server Web-Client 21. Mai 2002 Servlets JSP EJB Oder Java Bean JDBC DB Einführung ins Software Engineering - Design und Datenbanken -59- EJB • Also, JDBC war nett aber doch – Umständlich – Und Tätigkeiten eigentlich immer wiederkehrend… – Konsequenz: kann man das automatisieren? – Antwort: Ja → EJB Entity Beans 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -60- 30 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 EJB – Entity Beans • Repräsentieren persistente Daten und Domain Objects • Bieten create, find & delete Methoden zum Zugriff auf Datenbank • 2 Varianten – Entity Bean mit Bean managed Persistance. Bean selbst verantwortlich für Persistenz – Entity Bean mit Container managed Persistance. Container wird konfiguriert und kümmert sich dann um Persistenz • Definition und Konfiguration der persistenten Felder • Notwendiger Call-Back Routinen definieren 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -61- Entity Beans: Beispiel „Account bean“ <<interface>> javax.rmi.Remote <<interface>> javax.ejb.EJBMetaData <<interface>> javax.ejb.EJBObject <<interface>> javax.ejb.EJBHome <<interface>> javax.ejb.EntityBean <<interface>> Account <<interface>> Account Home Account Bean Home Interface (create,find,..) Implementierung Remote Interface 21. Mai 2002 Dr. Walter Kuhn EJB Framework Einführung ins Software Engineering - Design und Datenbanken -62- 31 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Account-Bean: Home Interface package com.dilbert; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.FinderException; public interface AccountHome extends javax.ejb.EJBHome { public Account create(String id) throws RemoteException, CreateException; public Account findByPrimaryKey(int id) throws RemoteException, FinderException; public Account findByPrimaryKey(AccountPK pk) throws FinderException, RemoteException; // remove() Methoden werden von EJBHome geerbt } 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -63- Account -Bean: Remote Interface package com.dilbert; import java.rmi.RemoteException; public interface Account extends javax.ejb.EJBObject { public String getName() throws RemoteException; public void setName(String name) throws RemoteException; public double getBalance() throws RemoteException; public void setBalance(double value) throws RemoteException; } 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -64- 32 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Account-Bean: Implementierung (1) package com.dilbert; import javax.ejb.EntityContext; public class AccountBean implements javax.ejb.EntityBean { // Deklaration der Container managed fields // = Zustandsvariable public int id; public String name; public double balance; // remote interface Implementierung public String getName(){return name;} public void setName(String str){name = str;} public int getBalance(){return balance;} public void setBalance(double b){balance = b;} //.. 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -65- Account Bean: Persistente Felder • Felder der Bean, die in Datenbank angelegt werden sollen (persistent), werden in Deployment Descriptor der Bean genannt und mit Tabellenfeldern assoziiert. • Alle nicht im Deployment Descriptor genannten Felder des Beans werden als transient betrachtet. • Properties: Felder, für die es auch eine Set- und GetMethode gibt • Primärschlüssel – Jedes Entitiy Bean benötigt einen serialisierbaren Primärschlüssel (oder eine eigene Klasse) – Verwendung: Zugriff auf Zeile in Datenbank – Ist eine Teilmenge der Bean-Felder 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -66- 33 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Account-Bean: Implementierung (2) // ejbCreate Methoden public void ejbCreate(int id){this.id = id;} public void ejbPostCreate(int id) // Lebenszyklus der Bean - callback Methoden public void setEntityContext(EntityContext ctx) { } public void unsetEntityContext(){} public void ejbActivate(){} public void ejbPassivate(){} public void ejbLoad(){} // Zustandsvariablen wurden gerade aus DB gelesen public void ejbStore(){} // Zustandsvariablen werden gleich in DB geschrieben public void ejbRemove(){} // Bean & Datensatz werden gleich gelöscht } 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -67- Account Bean: EJBCreate Methoden • jede create(...) Methode im AccountHome Interface korrespondiert zu einer ejbCreate(...) Methode in der AccountBean Klasse. • ejbPostCreate(...) Methoden werden automatisch nach Beendigung der entsprechenden ejbCreate(...) Methode aufgerufen. • ejbCreate(...) & ejbPostCreate(...) werfen keine Ausnahmen. Der Container kümmert sich darum, wenn Probleme auftauchen. findByPrimaryKey(...) wird nicht bei container-managed bean Klassen implementiert (unser Beispiel beinhaltet diese, um den Mechanismus generell aufzuzeigen) ejbPassivate() & ejbActivate() werden vom Container genutzt, während Beans (temporär) aus dem Speicher bzw. wieder geholt werden, hier können geeignete Bereinigungsmechanismen/Instanziierungsmechanismen genutzt werden – „Mapping“ und Aufruf erfolgt durch EJB-Container – Damit können beliebige Zusatz-Aufgaben erledigt werden. • • 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -68- 34 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Lebenszyklus einer Bean Does Not Exist unsetEntityContext() finalize() Class.newInstance() setEntityContext() client initialized Pooled ejbPassivate() create() ejbCreate() ejbPostCreate() remove() ejbRemove() Ready client initialized 21. Mai 2002 ejbActivate() ejbLoad() business method ejbStore() Einführung ins Software Engineering - Design und Datenbanken -69- Account-Bean: Primärschlüsselklasse package com.dilbert; public class AccountPK implements java.io.Serializable { // Einfache Version, hier wäre Komplexes möglich // Schlüsselfelder - Untermenge der Felder der Bean public int id; // finde damit den Eintrag // Spezialisierte Hash- und Vergleichsmethoden, da // die Schlüsselwerte und nicht die Java-Objekte // gehasht bzw. verglichen werden sollen. public int hashCode() { return id.hashCode(); } public boolean equals(Object obj) { return ( obj instanceOf AccountPK) && id.equals(((AccountPK)obj).id ); } } 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -70- 35 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Account Bean: Deployment Descriptor • • • • Nennt die Klassen, die ein Bean ergeben Beschreibt, wie Bean zur Laufzeit vom Container behandelt wird Zum Zeitpunkt der Definition des Beans erstellt (und serialisiert) Zum Zeitpunkt des Deployments im Container genutzt (dort deserialisiert) • Die (im Container noch veränderbare) Information wird genutzt., die Infrastruktur des Beans aufzusetzen – Füge das Bean dem Naming Serivce hinzu – Erzeuge das EJB Objekt und das EJB Home Objekt – Erzeuge notwendige DB-Persistenz-Infrastruktur – Erzeuge notwendige Infrastruktur für Transaktionen • Bem.: DeploymentDescriptor ist eine Klasse, die auch programmtechnisch erzeugt werden kann. Siehe javax.ejb.deployment (DeploymentDescriptor, ControlDescriptor, EntityDescriptor, SessionDescriptor) 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -71- Artikel-Bean: Deployment Descriptor <?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd"> <ejb-jar> <enterprise-beans> <entity> <description>Bean für Account-Stammdaten</description> <ejb-name>Account</ejb-name> <home>com.dilbert.AccountHome</home> <remote>com.dilbert.Account</remote> <ejb-class>com.dilbert.AccountBean</ejb-class> <persistence-type>Container</persistence-type> <prim-key-class>com.dilbert.AccountPK</prim-key-class> <reentrant>False</reentrant> <cmp-field> <field-name>id</field-name> </cmp-field> <cmp-field> <field-name>name</field-name> </cmp-field> Persistenz <cmp-field> <field-name>balance</field-name> </cmp-field> </entity> </enterprise-beans> 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -72- 36 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Artikel-Bean: Deployment Descriptor (2) <assembly-descriptor> <security-role> <description>Benutzer mit Vollzugriff</description> <role-name>Vollzugriff</role-name> </security-role> <method-permission> <role-name>Vollzugriff</role-name> <method> <ejb-name>Account</ejb-name> <method-name>*</method-name> </method> </method-permission> <container-transaction> <method> <ejb-name>Account</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar> 21. Mai 2002 Sicherheit Transaktionales Verhalten Einführung ins Software Engineering - Design und Datenbanken -73- Agenda • • • • • Modellbildung ERM SQL JDBC Entity Beans (Daten als Komponenten) Web-Server Web-Client 21. Mai 2002 Dr. Walter Kuhn Servlets JSP EJB Oder Java Bean JDBC Einführung ins Software Engineering - Design und Datenbanken DB -74- 37 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Daten als Komponenten (hier nur als Hinweis) Wollen wir hier aus Zeitgründen nicht vertiefen • XML – DTD und XML Schemata – Wohldefinierte, selbstbeschreibende Strukturen – Gremien, die Entities (und z.T. auch Geschäftsprozesse!) für Geschäftszwecke standardisieren, z.B. ebXML.org, xml.org, rosettanet.org • Java J2EE Entitiy Beans (die haben wir aufgezeigt) • Java Data Objects (transparente Mechanismen für Persistenz) • .. 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -75- Beispiel XML Datenobjekte • unterliegen einer spezifischen „DTD“ • sind wohldefiniert („Klammerung“) <Kunde> <Rechnung> <Adresse> Meine Adresse </Adresse> </Rechnung> </Kunde> • können von beliebigen Sprachen bearbeitet, verschickt und auch in Datenbanken abgefüllt werden 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -76- 38 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 Literatur • Gute Einführung in SQL und ERM: eine Legion an Büchern – Kevin Kline, Daniel Kline: SQL in a Nutshell, Januar 2001, O'Reilly – Gottfried Vossen: Datenbankmodelle, Datenbanksprachen und Datenbankmanagementsysteme. 4., korr. u. erg. Aufl. Ausgabe (2000) , Oldenbourg – Andreas Meier: Relationale Datenbanken. Leitfaden für die Praxis, 4., überarb. u. erw. Aufl. 2001 Ausgabe, Springer Verlag – J. Melton, A. R. Simon, J. Gray: „SQL: 1999 - Understanding Relational Language Components“, Morgan Kaufman Publishers, 2001 – Sönke Cordts: Datenbankkonzepte in der Praxis. Nach dem Standard SQL-99, 15. Januar 2002, Addison-Wesley – Gunter Saake, Kai-Uwe Sattler: Datenbanken und Java. JDBC, SQLJ und ODMG, 2000, dpunkt-Verlag – http://dx1.hrz.uni-dortmund.de:8001/doc1/hrz/sqlref/sqloracle.html • Einführung in MYSQL, (lokal siehe auch Server IFI) „MySQL Datenbankhandbuch“ – http://www.little-idiot.de/mysql/ – Michael Kofler: MySQL. Einführung, Programmierung, Referenz. 3. Aufl., 15. März 2001, Addison-Wesley • • JDBC Treiber von MySQL: http://mmmysql.sourceforge.net/ EJB: siehe letzte Woche 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -77- Hinweise fürs Praktikum • DB - MySQL • Aufgabe 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -78- 39 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 MySQL • Frei verfügbares, schnelles DBMS – www.mysql.com – Beratung und kommerzielle Implementierung ebenfalls verfügbar • MySQL orientiert sich am Standard von SQL-2 – jedoch keine vollständige Implementierung. – Z.Zt. fehlen Transaktionen, verschachtelte select-Anweisungen, select into table, Trigger, Fremdschlüssel und virtuelle Tabellen (Views). • Spezielle Implementierung bei MySQL „InnoDB“ unterstützt Transaktionen – Bei einigen nicht unterstützten Konstrukten wird zwar die Syntax der entsprechenden Anweisungen akzeptiert, sie aber im weiteren ignoriert (z.B. bei der Spezifikation von Fremdschlüsseln und weiterer Indizes). – MySQL unterstützt nicht das Rechtevergabesystem von SQL-2, sondern ein eigenes, das im Prinzip sehr viel eleganter ist, da es auf Tabellen und damit normalen Datenbankmechanismen beruht. – Einige dieser Einschränkungen haben den Vorteil, daß MySQL deutlich schneller ist als traditionelle Datenbanken. • Für konkrete Details wird auf MySQL Literatur verwiesen 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -79- MySQL – Nutzung – wichtigste Tools • mysqld – SQL daemon. Basis für Nutzung – zuerst starten, dann laufen lassen • mysqlshow – Information über DB, Tabellen, Spalten, Indizes • mysql_install_db – Erzeugt (einmalig bei Install.) das MySQL Rechte-System mit Defaults • mysqladmin – Administratives: Erzeugen, Löschen von Datenbanken, Statusinformation, .. – mysqladmin create mydatabase – Alternativ ein GUI dazu verwenden (winmysqladmin – empfohlen) • mysql – Interaktive Commandline-Utility. Gut für den Einstieg! – Kann auch nicht-interaktiv genutzt werden mysql database < script.sql > output.tab • JDBC Treiber: http://mmmysql.sourceforge.net/ 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -80- 40 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 MySQL – Ein Beispiel Shell> mysqld // Dämon, unter Unix // DB-Client starten Shell> mysql -h host -u user -p // passwort wird gefragt mysql> SELECT VERSION(), CURRENT_DATE; mysql> SHOW DATABASES; mysql> CREATE DATABASE petDB; mysql> USE petDB; mysql> SHOW TABLES; // sollte nix da sein mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE); mysql> DESCRIBE pet; mysql> INSERT INTO pet VALUES ('Puffball','Diane','hamster','f','1999-03-30', NULL); mysql> SELECT * FROM pet; //Hinweis: wenn Kommando nicht mit „;“ endet, dies unbedingt tun. Bei mehrzeiligen Eingaben auf der letzten Zeile 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -81- MySQL Laden / Saven • Zum Laden und Saven von größeren Datenblöcken gibt es meist spezielle Operationen. • MySQL: ASCII-file Konversion mit SELECT .. INTO OUTFILE '<filename>' .. und umgekehrt mit LOAD DATA [LOCAL] INFILE '<filename>' INTO TABLE <tablename> • Beispiel SELECT * INTO OUTFILE '/tmp/testfile_m.txt' FROM orte; CREATE TABLE city (plz int, oname varchar(25)); LOAD DATA INFILE '/tmp/testfile_m.txt' INTO TABLE city; 21. Mai 2002 Dr. Walter Kuhn Einführung ins Software Engineering - Design und Datenbanken -82- 41 Einführung ins Software Engineering Design und Datenbanken 21. Mai 2002 MySQL unterstützte Datentypen • Einige Beispiele (aus dem Manual), ansonsten -> „manual.htm“ – M = Maximum Display Size (max 255), D Numer of Digits after „.“, max 30 • INT[(M)] [UNSIGNED] [ZEROFILL] – A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295. • DOUBLE[(M,D)] [ZEROFILL] – A normal-size (double-precision) floating-point number. Cannot be unsigned. Allowable values are -1.7976931348623157E+308 to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308. The M is the display width and D is the number of decimals. DOUBLE without an argument or FLOAT(X) where 25 <= X <= 53 stands for a double-precision floating-point number. • DATETIME – A date and time combination. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'. MySQL displays DATETIME values in 'YYYY-MM-DD HH:MM:SS' format, but allows you to assign values to DATETIME columns using either strings or numbers. • BIT, BOOL, CHAR – These three are synonyms for CHAR(1). • [NATIONAL] VARCHAR(M) [BINARY] – A variable-length string. NOTE: Trailing spaces are removed when the value is stored (this differs from the ANSI SQL specification). The range of M is 1 to 255 characters. VARCHAR values are sorted and compared in case-insensitive fashion unless the BINARY keyword is given. 21. Mai 2002 Einführung ins Software Engineering - Design und Datenbanken -83- Übung • Nun nach dem GUI und der Business Logik unserer Bank die entsprechende Datenhaltung realisieren – Wahlweise einfacher JDBC Zugriff (empfohlen) – Oder für Mutige EJBs (Sven fragen – JBoss) – DB: MySQL Web-Server Web-Client 21. Mai 2002 Dr. Walter Kuhn Servlets JSP Java Bean Oder EJB JDBC Einführung ins Software Engineering - Design und Datenbanken DB -84- 42