20.13 Die LOBs (Large Objects)
 
Auf der Datenbankseite gibt es zwei Typen für besonders große Daten: BLOB und CLOB. »B« steht für Binary und »C« für Character, also einmal ein SQL BLOB für beliebig große Binärdaten und ein CLOB für beliebig große Textdaten.
Die LOBs unterscheiden sich von den anderen Datentypen dadurch, dass die Daten erst dann vom Treiber übertragen werden, wenn sie auch angesprochen werden: Wird eine Zeile mit einer Zahl übertragen, so wird der Treiber auch diese Zahl immer mitschicken. Bei den LOBs sieht das anders aus. Intern steckt dort eine Art Verweis (LOCATION), die mitgeschickt wird, aber nicht die Daten selbst. Durch die Kapselung im Treiber fällt das allerdings nicht auf.
Für den BLOB gibt es in JDBC die Schnittstelle Blob und für CLOB Clob. In beiden Fällen können die großen Daten erfragt, aktualisiert und angelegt werden. Weiterhin lässt sich die Länge erfragen und ab einer bestimmten Position Daten auslesen.
20.13.1 Einen BLOB besorgen
 
Für einen BLOB/CLOB gibt es genau im gleichen Sinne wie es für andere Datentypen entsprechende getXXX()-Funktionen gibt, eine getBlob()/getClob()-Funktion. Der Unterschied ist nur, das getInt() direkt ein int gibt, während getBlob() nur einen Referenz auf ein Blob-Objekt liefert, über den dann die Daten im zweiten Schritt bezogen werden müssen.
Beispiel Eine Tabelle Personen besitzt eine Spalte Bild, welches eine Grafik einer Person speichert. Die Grafik ist in einer Spalte vom Typ BLOB.
|
ResultSet rs = stmt.executeQuery( "SELECT * FROM Personen" );
rs.first();
Blob data = rs.getBlob( "Bild" );
data bezieht sich jetzt auf das Blob-Objekt. Es enthält noch nicht die Daten. Sie lassen sich zum Beispiel über die Methode data.getBinaryStream() beziehen. Damit lässt sich dieser InputStream toll im Konstruktor von ImageIcon() einsetzten, der aus den Daten dann gleich eine Swing-taugliche Grafik konstruiert. Teile des Datenfeldes werden mit byte[] getBytes(start, ende) angefordert. data.length() liefert die Anzahl Elemente des LOBs.
|