JavaでBYTEAデータを使用する¶
BYTEAデータ型は、バイナリストリングをバイトシーケンスで格納します。多くの場合、デジタル画像と音声ファイルはバイナリデータとして保存されます。 Advanced Serverは、 BYTEAデータ型を介してバイナリデータを保存および取得できます。
次のJavaサンプルは、 BYTEAデータをAdvanced Serverデータベースに保存し、そのデータを取得する方法を示しています。この例では少しセットアップが必要です。リスト1.12-a、1.12-b、および1.12-cは、Javaの例のサーバー側環境を作成します。
リスト1.12-aは、 BYTEAデータを保存するテーブル( emp_detail )を作成します。 emp_detailは2つの列が含まれます。最初の列は従業員のID番号( INT型)を格納し、テーブルの主キーとして機能します。 2列目には、従業員の写真がBYTEA形式でBYTEAます。
リスト1.12-a
CREATE TABLE emp_detail
(
empno INT4 PRIMARY KEY ,
pic BYTEA
);
リスト1.12-bは、 emp_detailテーブルに行を挿入するプロシージャ( ADD_PIC )を作成します。
リスト1.12-b
CREATE OR REPLACE PROCEDURE ADD_PIC ( p_empno IN int4 , p_photo IN bytea ) AS
BEGIN
INSERT INTO emp_detail VALUES ( p_empno , p_photo );
END ;
最後に、リスト1.12-cは、特定の従業員の写真を返す関数( GET_PIC )を作成します。
リスト1.12-c
CREATE OR REPLACE FUNCTION GET_PIC ( p_empno IN int4 ) RETURN BYTEA IS
DECLARE
photo BYTEA ;
BEGIN
SELECT pic INTO photo from EMP_DETAIL WHERE empno = p_empno ;
RETURN photo ;
END ;
BYTEAデータをAdvanced Serverデータベースに挿入する¶
1.13をリスト呼び出すJavaメソッドを示しADD_PICにクライアント・ファイル・システムから写真をコピーするには(1.12-Bリスト参照)の手順をemp_detailサーバー上にテーブル。
リスト1.13
public void InsertPic(Connection con)
{
try
{
Console c = System.console();
int empno = Integer.parseInt(c.readLine("Employee No :"));
String fileName = c.readLine("Image filename :");
File f = new File(fileName);
if(!f.exists())
{
System.out.println("Image file not found. Terminating...");
return;
}
CallableStatement stmt = con.prepareCall("{call ADD_PIC(?, ?)}");
stmt.setInt(1, empno);
stmt.setBinaryStream(2, new FileInputStream(f), (int)f.length());
stmt.execute();
System.out.println("Added image for Employee "+empno);
}
catch(Exception err)
{
System.out.println("An error has occurred.");
System.out.println("See full details below.");
err.printStackTrace();
}
}
InsertPic()は、従業員番号と画像ファイルの名前の入力をユーザーに求めます。
int empno = Integer.parseInt(c.readLine("Employee No :"));
String fileName = c.readLine("Image filename :");
要求されたファイルが存在しない場合、 InsertPic()はエラーメッセージを表示して終了します。
File f = new File(fileName);
if(!f.exists())
{
System.out.println("Image file not found. Terminating...");
return;
}
次に、 InsertPic()は、 ADD_PICプロシージャーを呼び出すCallableStatementオブジェクト( stmt )をADD_PICます。最初のプレースホルダー(?)は、 ADD_PIC (p_empno)予期する最初のパラメーターを表します。 2番目のプレースホルダー
2番目のパラメーター( p_photo )を表します。これらのプレースホルダーの実際の値を提供するために、 InsertPic()は2つのセッターメソッドを呼び出します。最初のパラメータは型であるためINTEGER 、 InsertPic()呼び出しsetInt()のための値を提供する方法p_empno 。 2番目のパラメーターはBYTEA型であるため、 InsertPic()はバイナリセッターメソッドを使用します。この場合、メソッドはsetBinaryStream()です。
CallableStatement stmt = con.prepareCall("{call ADD_PIC(?, ?)}");
stmt.setInt(1, empno);
stmt.setBinaryStream(2 ,new FileInputStream(f), f.length());
プレースホルダーが実際の値にバインドされたので、 InsertPic()はCallableStatementます。
stmt.execute();
すべてうまくInsertPic()ば、 InsertPic()は、画像がテーブルに追加されたことを確認するメッセージを表示します。エラーが発生した場合、 catchブロックはユーザーにメッセージを表示します。
System.out.println("Added image for Employee \""+empno);
catch(Exception err)
{
System.out.println("An error has occurred.");
System.out.println("See full details below.");
err.printStackTrace();
}
Advanced ServerデータベースからBYTEAデータを取得する¶
JavaアプリケーションからBYTEAデータを挿入する方法がわかったので、リスト1.14に、サーバーからBYTEAデータを取得する方法を示します。
リスト1.14
public static void GetPic(Connection con)
{
try
{
Console c = System.console();
int empno = Integer.parseInt(c.readLine("Employee No :"));
CallableStatement stmt = con.prepareCall("{?=call GET_PIC(?)}");
stmt.setInt(2, empno);
stmt.registerOutParameter(1, Types.BINARY);
stmt.execute();
byte[] b = stmt.getBytes(1);
String fileName = c.readLine("Destination filename :");
FileOutputStream fos = new FileOutputStream(new File(fileName));
fos.write(b);
fos.close();
System.out.println("File saved at \""+fileName+"\"");
} catch(Exception err){System.out.println( "エラーが発生しました。"); System.out.println( "以下の詳細を参照してください。"); err.printStackTrace(); }} GetPic()は、ユーザーに従業員ID番号の入力を求めることから開始します。
int empno = Integer.parseInt(c.readLine("Employee No :"));
次に、 GetPic()は、1つのINパラメーターと1つのOUTパラメーターを持つCallableStatementを準備します。最初のパラメーターは、データベースから取得した写真を含むOUTパラメーターです。写真はBYTEAデータであるため、 GetPic()はパラメーターをType.BINARYとして登録します。第二のパラメータは、 IN従業員番号(保持パラメータINT )のでGetPic()使用setInt() 2番目のパラメータの値を提供する方法。
CallableStatement stmt = con.prepareCall("{?=call GET_PIC(?)}");
stmt.setInt(2, empno);
stmt.registerOutParameter(1, Types.BINARY);
次に、 GetPic()使用getBytes取得するために、ゲッターメソッドをBYTEAデータCallableStatement :
stmt.execute();
byte[] b = stmt.getBytes(1);
プログラムは、写真を保存するファイルの名前をユーザーに要求します。
String fileName = c.readLine("Destination filename :");
FileOutputStreamオブジェクトは、写真を含むバイナリデータを宛先ファイル名に書き込みます。
FileOutputStream fos = new FileOutputStream(new File(fileName));
fos.write(b);
fos.close();
最後に、 GetPic()は、ファイルが新しい場所に保存されたことを確認するメッセージを表示します。
System.out.println("File saved at \""+fileName+"\"");
