Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Neues in Java 7
2 Threads und nebenläufige Programmierung
3 Datenstrukturen und Algorithmen
4 Raum und Zeit
5 Dateien, Verzeichnisse und Dateizugriffe
6 Datenströme
7 Die eXtensible Markup Language (XML)
8 Dateiformate
9 Grafische Oberflächen mit Swing
10 Grafikprogrammierung
11 Netzwerkprogrammierung
12 Verteilte Programmierung mit RMI
13 RESTful und SOAP Web-Services
14 JavaServer Pages und Servlets
15 Applets
16 Datenbankmanagement mit JDBC
17 Technologien für die Infrastruktur
18 Reflection und Annotationen
19 Dynamische Übersetzung und Skriptsprachen
20 Logging und Monitoring
21 Java Native Interface (JNI)
22 Sicherheitskonzepte
23 Dienstprogramme für die Java-Umgebung
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
Java 7 - Mehr als eine Insel von Christian Ullenboom
Das Handbuch zu den Java SE-Bibliotheken
Buch: Java 7 - Mehr als eine Insel

Java 7 - Mehr als eine Insel
Rheinwerk Computing
1433 S., 2012, geb.
49,90 Euro, ISBN 978-3-8362-1507-7
Pfeil 16 Datenbankmanagement mit JDBC
Pfeil 16.1 Relationale Datenbanken
Pfeil 16.1.1 Das relationale Modell
Pfeil 16.2 Datenbanken und Tools
Pfeil 16.2.1 HSQLDB
Pfeil 16.2.2 Weitere Datenbanken *
Pfeil 16.2.3 Eclipse-Plugins zum Durchschauen von Datenbanken
Pfeil 16.3 JDBC und Datenbanktreiber
Pfeil 16.3.1 Treibertypen *
Pfeil 16.3.2 JDBC-Versionen *
Pfeil 16.4 Eine Beispielabfrage
Pfeil 16.4.1 Schritte zur Datenbankabfrage
Pfeil 16.4.2 Ein Client für die HSQLDB-Datenbank
Pfeil 16.4.3 Datenbankbrowser und eine Beispielabfrage unter NetBeans
Pfeil 16.5 Mit Java an eine Datenbank andocken
Pfeil 16.5.1 Der Treiber-Manager *
Pfeil 16.5.2 Den Treiber laden
Pfeil 16.5.3 Eine Aufzählung aller Treiber *
Pfeil 16.5.4 Log-Informationen *
Pfeil 16.5.5 Verbindung zur Datenbank auf- und abbauen
Pfeil 16.6 Datenbankabfragen
Pfeil 16.6.1 Abfragen über das Statement-Objekt
Pfeil 16.6.2 Ergebnisse einer Abfrage in ResultSet
Pfeil 16.6.3 Java und SQL-Datentypen
Pfeil 16.6.4 Date, Time und Timestamp
Pfeil 16.6.5 Unicode in der Spalte korrekt auslesen
Pfeil 16.6.6 Eine SQL-NULL und wasNull() bei ResultSet
Pfeil 16.6.7 Wie viele Zeilen hat ein ResultSet? *
Pfeil 16.7 Elemente einer Datenbank hinzufügen und aktualisieren
Pfeil 16.7.1 Batch-Updates
Pfeil 16.7.2 Die Ausnahmen bei JDBC, SQLException und Unterklassen
Pfeil 16.8 ResultSet und RowSet *
Pfeil 16.8.1 Die Schnittstelle RowSet
Pfeil 16.8.2 Implementierungen von RowSet
Pfeil 16.8.3 Der Typ CachedRowSet
Pfeil 16.8.4 Der Typ WebRowSet
Pfeil 16.9 Vorbereitete Anweisungen (Prepared Statements)
Pfeil 16.9.1 PreparedStatement-Objekte vorbereiten
Pfeil 16.9.2 Werte für die Platzhalter eines PreparedStatement
Pfeil 16.10 Transaktionen
Pfeil 16.11 Metadaten *
Pfeil 16.11.1 Metadaten über die Tabelle
Pfeil 16.11.2 Informationen über die Datenbank
Pfeil 16.12 Vorbereitete Datenbankverbindungen
Pfeil 16.12.1 DataSource
Pfeil 16.12.2 Gepoolte Verbindungen
Pfeil 16.13 JPA-Beispiel mit der NetBeans-IDE
Pfeil 16.13.1 Entity-Beans generieren
Pfeil 16.13.2 Die Quellen im Überblick
Pfeil 16.13.3 Persistence Unit
Pfeil 16.13.4 Ein JPA-Beispielprogramm
Pfeil 16.14 Zum Weiterlesen

Rheinwerk Computing - Zum Seitenanfang

16.11 Metadaten *Zur nächsten Überschrift

Von einer Datenbank können verschiedene Informationen ausgelesen werden. Zum einen sind dies Informationen zu einer bestimmten Tabelle, zum anderen Informationen über die Datenbank selbst.


Rheinwerk Computing - Zum Seitenanfang

16.11.1 Metadaten über die TabelleZur nächsten ÜberschriftZur vorigen Überschrift

Bei der Abfrage über alle Spalten müssen wir die Struktur der Datenbank kennen, insbesondere dann, wenn wir allgemeine Abfragen vornehmen und die passenden Daten herauslesen wollen. So liefert SELECT * FROM Item ein ResultSet mit der Anzahl der Spalten, wie sie die Tabelle Item hat. Doch bevor wir nicht die Anzahl und die Art der Spalten kennen, können wir nicht auf die Daten zugreifen.

Um diese Art von Informationen, sogenannte Metadaten, in Erfahrung zu bringen, befindet sich die Klasse ResultSetMetaData, mit der wir diese Informationen erhalten, unter den SQL-Klassen. Metadaten können für jede Abfrage angefordert werden. So lässt sich unter anderem leicht herausfinden:

  • wie viele Spalten wir in einer Zeile abfragen können
  • wie der Name der Spalte lautet
  • welchen SQL-Typ die Spalte hat
  • ob NULL für eine Spalte in Ordnung ist
  • wie viele Dezimalzeichen eine Spalte hat

Einige Informationen über die Bestellelemente

Um Anzahl und Art der Spalten einer Bestelltabelle herauszufinden, werden wir zunächst ein ResultSet mit stmt.executeQuery("SELECT * FROM Item") erzeugen und dann via getMetaData() ein ResultSetMetaData-Objekt erfragen. Das ResultSetMetaData-Objekt besitzt viele Methoden, um Aussagen über die Tabelle und Spalten zu treffen. So fragen wir mit getColumnCount() nach, wie viele Spalten die Tabelle hat. Anschließend lässt sich für jede Spalte der Name und Typ erfragen:

Listing 16.9: com/tutego/insel/jdbc/TableMetaData.java, main()

Connection con = ((DataSource)
new InitialContext().lookup( "TutegoDS" )).getConnection();
try
{
ResultSet rs = con.createStatement().executeQuery( "SELECT * FROM ITEM" );
ResultSetMetaData meta = rs.getMetaData();

int numerics = 0;

for ( int i = 1; i <= meta.getColumnCount(); i++ )
{
System.out.printf( "%-20s %-20s%n", meta.getColumnLabel( i ),
meta.getColumnTypeName( i ) );

if ( meta.isSigned( i ) )
numerics++;
}

System.out.println();
System.out.println( "Spalten: " + meta.getColumnCount() +
", Numerisch: " + numerics );
}
finally
{
con.close ();
}
interface java.sql.ResultSet
extends Wrapper, AutoCloseable
  • ResultSetMetaData getMetaData() throws SQLException
    Liefert die Eigenschaften eines ResultSet in einem ResultSetMetaData zurück.
interface java.sql.ResultSetMetaData
extends Wrapper
  • int getColumnCount()
    Liefert die Anzahl der Spalten im aktuellen ResultSet. Das ist praktisch für SQL-Anweisungen wie SELECT *.

Allen folgenden Methoden wird ein int übergeben, das die Spalte kennzeichnet:

  • String getCatalogName(int column)
    Gibt den String mit dem Katalognamen der Tabelle für die angegebene Spalte zurück.
  • String getColumnName(int column)
    Liefert den Spaltennamen der Tabelle.
  • int getColumnDisplaySize(int column)
    Maximale Anzahl der Zeichen, die die Spalte einnimmt. So ist bei einer Spalte vom Typ VARCHAR(11) mit einer maximalen Spaltenbreite von zehn Zeichen zu rechnen. Bei numerischen Spalten variiert der Wert.
  • String getColumnLabel(int column)
    Gibt einen String zurück, der den Titel der angegebenen Spalte enthält. Der Titel gibt an, welche Überschrift für die Spalte angezeigt werden soll. Einige Datenbanken erlauben die Unterscheidung zwischen Spaltennamen und Spaltentitel.
  • int getColumnType(int column)
    Der Typ der Spalte wird ermittelt. Der Spaltentyp ist dabei eine Konstante aus der Klasse java.sql.Types. Sie deklariert Konstanten nach dem XOPEN-Standard. Die Reihenfolge der Datentypen ist: ARRAY_LOCATOR, BIGINT, BINARY, BIT, BLOB_LOCATOR, CHAR, CLOB_LOCATOR, DATE, DECIMAL, DISTINCT, DOUBLE, FLOAT, INTEGER, JAVA_OBJECT (benutzerdefinierter Datentyp), LONGVARBINARY, LONGVARCHAR, NULL, NUMERIC, REAL, REF, SMALLINT, STRUCT, STRUCT_LOCATOR, TIME, TIMESTAMP, TINYINT, VARBINARY, VARCHAR. Die Konstante OTHER zeigt ein datenbankspezifisches Element an und wird auf ein Java-Objekt abgebildet, falls ein Zugriff mittels getObject() oder setObject() erfolgt.
  • String getColumnTypeName(int column)
    Liefert den Namen der Spalte, so wie sie die Datenbank definiert.
  • int getPrecision(int column)
    Liefert die Dezimalgenauigkeit der Spalte, zurückgegeben als Anzahl der Ziffern.
  • int getScale(int column)
    Liefert die Genauigkeit der Spalte. Dies ist die Anzahl der Stellen, die nach dem Dezimalpunkt verwendet werden können.
  • String getSchemaName(int column)
    Der Name des Tabellenschemas. Wird von den Methoden des DatabaseMetaData-Objekts benutzt. Falls kein Schema vorhanden ist, wird "" zurückgegeben.
  • String getTableName(int column)
    Liefert den Tabellennamen der angegebenen Spalte.
  • boolean isAutoIncrement(int column)
    Stellt fest, ob eine Spalte eine Auto-Increment-Spalte ist. Diese nimmt dann automatisch den nächsten freien Wert an, wenn ein neuer Datensatz eingefügt wird. Ist die erste Zeile einer Tabelle mit einer Auto-Increment-Spalte eingefügt, so nimmt die Spalte den Wert 1 an. In den meisten Datenbanken ist es allerdings nicht möglich, eigene Werte in diesen Spalten einzutragen.
  • boolean isCaseSensitive(int column)
    Berücksichtigt die Spalte die Groß- beziehungsweise Kleinschreibung?
  • boolean isCurrency(int column)
    Enthält die Spalte Geldwerte? Nur einige Datenbanken bieten diesen Spaltentyp.
  • boolean isNullable(int column)
    Ist ein SQL-NULL in der Spalte erlaubt?
  • boolean isSearchable(int column)
    Kann die Spalte in einer SQL-WHERE-Klausel verwendet werden?
  • boolean isSigned(int column)
    Enthält die Spalte vorzeichenbehaftete Datentypen? Vorzeichenbehaftete Typen sind unter anderem INT, LONGINT und SMALLINT. Vorzeichenlose Typen sind unter anderem UINT, ULONG und UBYTE.
  • boolean isReadOnly(int column)
    Ist es möglich, auf die Spalte definitiv nicht schreibend zuzugreifen? Ist das Ergebnis true, kann der Wert also nicht aktualisiert werden.
  • boolean isWritable(int column)
    Ist es prinzipiell möglich, auf die Spalte schreibend zuzugreifen? Häufig wird das als !isReadOnly(column) implementiert.
  • boolean isDefinitelyWritable(int column)
    Kann auf die Spalte definitiv schreibend zugegriffen werden? Viele Datenbanken liefern die gleichen Ergebnisse bei isDefinitelyWritable() und isWritable(). Prinzipiell könnte der Zustand von isWritable() abweichen, wenn sich zum Beispiel die Schreibbarkeit dynamisch ändert.

Alle Methoden können eine SQLException auslösen.


Rheinwerk Computing - Zum Seitenanfang

16.11.2 Informationen über die DatenbankZur vorigen Überschrift

Metadaten sind auch für die gesamte Datenbank abfragbar. Beispiele für diese Informationen sind:

  • Welche Tabellen liegen in der Datenbank?
  • Wer ist mit der Datenbank verbunden?
  • Kann die Datenbank nur gelesen oder kann auch in die Datenbank geschrieben werden?
  • Wie lauten die Primärschlüssel für eine Tabelle?
  • Sind gespeicherte Prozeduren auf der Datenbankseite erlaubt?
  • Lassen sich äußere Joins (outer joins) durchführen?

Sind Informationen über die Datenbank gefragt, so lassen sich über Metadaten eines DatabaseMetaData-Objekts beispielsweise Datenbankeigenschaften des Herstellers herausfinden. Zunächst benötigen wir dazu ein DatabaseMetaData-Objekt, das uns getMetaData() von einer Connection gibt. Das DatabaseMetaData-Objekt deklariert eine große Anzahl Methoden:

Listing 16.10: com/tutego/insel/jdbc/DBMetaData.java, Ausschnitt

DatabaseMetaData meta = con.getMetaData();
System.out.println( "Product name " + meta.getDatabaseProductName() );
System.out.println( "Version: " + meta.getDatabaseProductVersion() );
System.out.println( "Maximum number of connections: " + meta.getMaxConnections() );
System.out.println( "JDBC driver version: " + meta.getDriverVersion() );
System.out.println( "Supports update in batch: " + meta.supportsBatchUpdates() );
System.out.println( "Supports stored procedures: " + meta.supportsStoredProcedures() );


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Neuauflage: Java SE 8 Standard-Bibliothek
Neuauflage: Java SE 8 Standard-Bibliothek
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Einstieg in Eclipse






 Einstieg in Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2012
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de