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.