setXXXStreamにより、アプリケーションとデータベース間で情報を通信させることができます。
JDBCではINの引数に、Javaの入力ストリームをとって、大規模な情報を小分けにして渡すことができます。文が実行されると、JDBCドライバはこの入力ストリームへの呼び出しを繰り返します。
ではJDBC 1.2が提供する三種類のストリームを利用することができます。
この三種類のストリームとは、
- setBinaryStream
解釈されないバイトストリームに使われます。
- setAsciiStream
ASCII文字のストリームに使われます。
- setUnicodeStream
Unicode文字のストリームに使われます。
JDBC 2.0やJDBC 3.0ではストリームの長さを指定する必要があります。ではアプリケーションがJDK 1.5以前の環境で動作している時、この事は要件です。JDK1.6以降の環境では、はJDBC4.0の実装を提供します。これによりストリーム長を指定する必要のないストリームのインターフェイスを使うことができます。
これらの三つのメソッドに渡すストリームオブジェクトは、標準のJavaストリームオブジェクトあるいは標準のjava.io.InputStreamインターフェイスを実装する、ユーザが定義したサブクラスの何れであっても構いません。
JDBCの標準に従い、ストリームは以下の表に記すデータ型の列に対してのみ記録できます。
ストリーム可能なJDBCのデータ型
列のデータ型
対応するJavaの型
AsciiStream
UnicodeStream
BinaryStream
CLOB
java.sql.Clob
x
x
CHAR
x
x
VARCHAR
x
x
LONGVARCHAR
X
X
BINARY
x
x
x
BLOB
java.sql.Blob
x
x
x
VARBINARY
x
x
x
LONGVARBINARY
x
x
X
- この表にて大文字のXは、ストリームの型として推奨される対照型である事を表します。を参照してください。
- もしストリームの記録される列の型がLONG VARCHARないしLONG VARCHAR FOR BIT DATAの何れでも無い場合、ストリーム全体が一括してメモリに収まらなければなりません。
LONG VARCHARおよびLONG VARCHAR FOR BIT DATAの列に記録されるストリームについては、この制限はありません。
- ストリームを他の組み込みデータ型やユーザが定義したデータ型に記録することはできません。
以下の例はjava.io.Fileをストリーム経由でLONG VARCHAR型の列に格納する方法を示します。
Statement s = conn.createStatement();
s.executeUpdate("CREATE TABLE atable (a INT, b LONG VARCHAR)");
conn.commit();
java.io.File file = new java.io.File("derby.txt");
int fileLength = (int) file.length();
// まず入力ストリームを作ります。
java.io.InputStream fin = new java.io.FileInputStream(file);
PreparedStatement ps = conn.prepareStatement(
"INSERT INTO atable VALUES (?, ?)");
ps.setInt(1, 1);
// 入力パラメータに入力ストリームを代入します。
ps.setAsciiStream(2, fin, fileLength);
ps.execute();
conn.commit();