18.9.1 | Zugriff auf LONG und LONG RAW |
Angenommen, die Shop-Anwendung ermöglicht es, zu jedem Titel
das zugehörige Cover als Bild in der Datenbank abzulegen.
Mit folgenden Zeilen wird zu einem bereits existenten Titel ein Bild in die Datenbank geladen:
import java.sql.*;
import java.io.*;
...
Connection con;
...
// SQL-Anweisung initialisieren
String sql =
"UPDATE titel SET bild = ? WHERE tit_id = ?";
PreparedStatement prep = con.prepareStatement(sql);
// Bilddaten als Stream setzen
File f = new File("c:\\bilder\\titel1.jpg");
FileInputStream fin = new FileInputStream(f);
prep.setBinaryStream(1, fin, (int)f.length());
// Titel-ID setzen
prep.setLong(2, 1);
prep.executeUpdate();
fin.close();
...
Für den Zugriff auf die Bilddaten, die auf der lokalen Festplatte abgelegt sind,
wird ein FileInputStream
erzeugt, der mit der Methode setBinaryStream()
dem PreparedStatement-Exemplar übergeben wird.
Damit der Treiber weiß, wieviele Daten er aus dem Stream in die Datenbank schreiben soll,
muss zusätzlich die Größe des Bildes übergeben werden.
Sie kann über die Methode length()
der Klasse File ermittelt werden. Da die Methode einen
long-Wert zurückliefert, muss
sie zunächst in einen int-Wert umgewandelt werden. Nachdem beide Parameter gesetzt sind,
werden die Daten durch Aufruf von executeUpdate() in die Datenbank geschrieben.
Das Setzen von LOB-Daten in INSERT-Anweisungen funktioniert analog. Es wird lediglich die SQL-Anweisung ersetzt. Beim Setzen von LOBs in UPDATE-Anweisungen sollte man jedoch beachten, dass die SQL-Anweisung nur eine Zeile verändert, da sonst vom Oracle-JDBC-Treiber ein Fehler ausgelöst wird.
Das Abfragen von LOB-Werte funktioniert ähnlich, wie folgendes Beispiel zeigt:
import java.sql.*;
import java.io.*;
...
Connection con;
...
// SQL-Anweisung initialisieren
sql = "SELECT bild FROM titel WHERE tit_id = 1";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()) { // Titel gefunden ?
// Ausgabe-Stream anlegen, um Bild zu schreiben
FileOutputStream fout = new FileOutputStream("c:\\bild.jpg");
byte puffer[] = new byte[1024];
int anzahl;
// Auslesen der Bilddaten und in Datei schreiben
InputStream in = rs.getBinaryStream(1);
while((anzahl = in.read(puffer)) != -1) {
fout.write(puffer);
}
// Schließen der Streams
fout.close();
in.close();
}
...
Nach der Ausführung der SQL-Abfrage wird der Stream, über den die Bilddaten gelesen werden,
mit der Methode getBinaryStream() von der Ergebnismenge abgerufen.
Danach werden alle Daten mit read() vom Stream gelesen und direkt in den
Ausgabe-Stream geschrieben, der mit einer Datei verbunden ist.
Der Zugriff auf Zeichendaten wird entsprechend durchgeführt. Das Einzige, was sich hierbei ändert, sind die Streams, die zum Lesen bzw. Schreiben der Daten benutzt werden. Streams zum Lesen ruft man über die Methoden getCharacterStream() (JDBC 2.0) bzw. getASCIIStream() setUnicodeStream() (JDBC 1.0) ab, Streams zum Schreiben werden mit den entsprechenden setXXX()-Methoden gesetzt. Bei der Verwendung der Character-Stream-Methoden ist zu beachten, dass sie keine einfachen Streams verwenden, sondern Reader zurückliefern bzw. Writer als Argumente entgegennehmen.