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 der Treiber erst dann die Daten überträgt, 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. Außerdem lässt sich die Länge erfragen und ab einer bestimmten Position Daten auslesen.
20.13.1 Einen BLOB besorgen
 
Einem BLOB/CLOB steht genau, wie es für andere Datentypen entsprechende getXXX()-Funktionen gibt, eine getBlob()/getClob()-Funktion zur Verfügung. Der Unterschied besteht nur darin, dass getInt() direkt ein int gibt, während getBlob() nur eine Referenz auf ein Blob-Objekt liefert, über die dann die Daten im zweiten Schritt zu beziehen sind.
Beispiel Eine Tabelle Personen weist eine Spalte Bild auf, die 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() einsetzen, 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.
|