Java Class Library Guide (v11)

Java クラス ライブラリ使用時の最初の手順

Java Btrieve アプリケーションを作成するには、まず以下の手順に従います。

  1. 環境が正しいかどうかの確認
  2. データベースとテーブルの作成
  3. Pervasive データベースへの接続
  4. テーブルの取得と行セットの作成
  5. 行セット内での行間の移動
  6. データの制限またはフィルター処理
  7. 行の挿入、更新または削除
  8. 複数のオペレーションによるトランザクションへの結合
  9. バイナリ ラージ オブジェクト(BLOB)の格納と取得

環境が正しいかどうかの確認

環境が、「環境設定の方法」で説明しているように正しくセットアップされているかどうかを確認する必要があります。

また、psql.jar が CLASSPATH 環境変数内にあるかどうかを確認します。この手順は、インストール手順で既に実行しているはずです。Pervasive Java インターフェイス クラス ライブラリ内のクラスにアクセスするには、Java ソース ファイルにパッケージをインポートする必要があります。

import pervasive.database.*; 

データベースとテーブルの作成

現在、Pervasive Java インターフェイスのクラス ライブラリは、データベースとデータベース テーブルの作成をサポートしていません。これらの作業を実行するには Pervasive Control Center を使用します。データベースのデータ辞書ファイル(DDF)およびデータ ファイルを作成したら、Java API クラスを使用してテーブルを追加してアクセスすることができます。

Pervasive Control Center とテーブルの作成の詳細については、『Pervasive PSQL User's Guide』を参照してください。

Pervasive データベースへの接続

Pervasive データベースに接続するには、エンジンに直接接続します。

URI を使用してデータベースに接続するには

  1. Driver から Session オブジェクトを取得します。
    Session session = Driver.establishSession();
  2. Session オブジェクトを使用してデータベースに接続します。URI を指定してデータベースに接続します。少なくとも、この URI には btrv:///dbname を含めてください。
    Database db = session.connectToDatabase("btrv:///demodata");
    または
    Database db = session.connectToDatabase("btrv://user@host/demodata?password=password");
    データベース セキュリティおよび URI の詳細については、『Advanced Operations Guide』を参照してください。

テーブルの取得と行セットの作成

データベースからのテーブルの検索

Table table = db.getTable("MyTable"); 

ここで、「MyTable」 はデータベース テーブルの名前です。テーブル名では大文字と小文字を区別します。

また、データベースのテーブル名のリストを取得することもできます。

String [] names = db.getTableNames(); 

Table オブジェクトのプロパティにアクセスするには

Table オブジェクトがあれば、TableMetaData オブジェクトからの列とインデックスに関する情報が得られます。

TableMetaData tmd = table.getTableMetaData(); 

いくつかの例を以下に示します。

// 列数を取得する 
int num_columns = tmd.getColumnCount();  
// 列 0 のデータ型を取得する 
int data_type = tmd.getColumnDef(0).getType());  
// 列 0 の列の長さを文字数で取得する  
int col_length = tmd.getColumnDef(0).getOffset(); 

Table オブジェクトの行にアクセスするには

Table の行にアクセスするには、Table オブジェクトでしか作成できない RowSet オブジェクトが必要です。

RowSet rowset = table.createRowSet(); 

同じテーブルから複数の RowSet オブジェクトを作成できます。RowSet オブジェクトは、テーブルの行を取得したり、新しい行を挿入したり、既存の行を削除および更新する場合に使用します。すべてのテーブルの行を繰り返し取得するには、RowSet オブジェクトを作成し、PsqlEOFException が発生するまで getNext() を呼び出します。

try { 
   while(true)  
      Row row = rowset.getNext();  
} 
catch(PsqlEOFException ex) { 
// もう行は残っていない  
} 

Rowset オブジェクトのプロパティにアクセスするには

RowSet オブジェクトがあれば、RowSetMetaData から RowSet に関する情報を得ることができます。

RowSetMetaData rsmd = rowset.getRowSetMetaData(); 

詳細については、Pervasive PSQL Java Class Library リファレンス(Javadoc)の RowSetMetaData クラスのメソッドを参照してください。

行セット内での行間の移動

前に示したように、getNext メソッドを繰り返し呼び出し、行セットのすべての行を取得することができます。行セットの RowSetMetaData オブジェクトの direction プロパティを変更すれば、後方へ繰り返すことができます。

rsmd.setDirection(Const.BTR_BACKWARDS); 

このプロパティを設定した後、getNext メソッドの動作は getPrevious になります。


メモ

以下の手順に示すように、行セットのカレンシーは、いつでもリセットして、最初の行の前または最後の行の後になるようにすることができます。これは、行セット全体を繰り返さなくても、最初の行または最後の行を取得できる効率的な方法です。


行セット内の最初の行を取得するには

  1. 方向を前方に設定します。これはデフォルトです。
    rsmd.setDirection(Const.BTR_FORWARDS);  
    
  2. 最初の行の前に行セットのカレンシーを設定します。
    rowset.reset();  
    
  3. 最初の行を検索します。
    Row first = rowset.getNext(); 
    

行セット内の最後の行を取得するには

  1. 方向を後方に設定します。
    rsmd.setDirection(Const.BTR_BACKWARDS);  
    
  2. 最後の行の後に行セットのカレンシーを設定します。
    rowset.reset();  
    
  3. 最後の行を検索します。
    Row last = rowset.getNext(); 
    

Row オブジェクトの列データにアクセスするには

Row オブジェクトは、Buffer クラスから多数の accessor メソッドまたは mutator メソッドを継承します。これらのメソッドで、Row オブジェクトのバッファーに対して列データを設定または取得できます。

  1. たとえば、String として列 0 でデータを取得するには、以下のうちの 1 つを実行します。
    String str = row.getString(0);
    または
    String str = row.getString("ColumnName");
    ここで ColumnName は列 0 に対してデータ辞書で定義されている名前です。列名は大文字と小文字を区別します。
  2. 次に、列 0 に対してデータを設定するには、setString メソッドのうちの 1 つを使用します。
    row.setString(0, "MyColumnData");
    または
    row.setString("ColumnName", "MyColumnData");
  3. 詳細については、Pervasive PSQL Java Class Library リファレンス(Javadoc)の Buffer クラスのメソッドを参照してください。

データの制限またはフィルター処理

行セット内の行を制限またはフィルター処理するには

行セットの行を制限またはフィルター処理するには、RowSetMetaData の addFirstTerm、addOrTerm、および addAndTerm を使用する必要があります。たとえば、テーブルの最初の列に整数データが入っていて、その最初の列の値が 23 より大きい行をすべて取得する場合は、以下の手順に従います。

  1. 行セットの RowSetMetaData を取得します。
    RowSetMetaData rsmd = rowset.getRowSetMetaData();  
    
  2. 最初の列、つまり列番号 0 に対して ColumnDefを取得します。
    ColumnDef cmd = rsmd.getColumnDef(0);  
    
  3. 行セットのカレンシーを先頭位置にリセットします。
    rowset.reset();  
    
  4. 最初の条件を追加します。
    rowset.addFirstTerm(cmd, Consts.BTR_GR, "23");  
    
  5. getNext を呼び出して 列 0 が 23 よりも大きい最初の行を取得します。
    Row row = rowset.getNext(); 
    

RowSetMetaData の addOrTerm および addAndTerm を使用して項目を追加することができます。これらのメソッドを使用すれば、SQL の WHERE 句と同じように、さらに複雑なフィルター処理を設定できます。

行セットから列を選択するには

RowSetMetaData のメソッド addColumns および dropColumns を使用すれば、SQL の SELECT ステートメントと同じように、取得する列のサブセットを指定できます。noColumns パラメーターを True に設定して行が作成されていない限り、デフォルトでは、行セットはすべての列データを取得します。

RowSet rowset = table.createRowSet(true); 

この場合、列は取得されません。その代わり、行セットを作成後、行の一部または全部を削除できます。

RowSetMetaData rsmd = rowset.getRowSetMetaData(); 
rsmd.dropAllColumns(); 

次に、対象の列のセットを行セットに追加できます。

rsmd.addColumns("LastName", "FirstName"); 

行セットに列を追加するには、列名または列番号を使用できます。詳細については、Pervasive PSQL Java Class Library リファレンス(Javadoc)の RowSetMetaData クラスの addColumns メソッドと dropColumns メソッドの項を参照してください。

列番号で行内の列データにアクセスする場合、列番号は addColumns メソッドと dropColumns メソッドによって生成される新しい順序の影響を受けるので、注意してください。たとえば、FirstName は最初は行セットの列番号 3 であった場合、すべての列を削除した後に LastName と FirstName を追加すると、FirstName の列番号は 1 になります。

インデックスで行を取得するには

定義されたインデックスを比較演算子と共に使用すれば、行を取得できます。たとえば、インデックス Last_Name が仮想テーブルの LastName 列で作成されている場合、以下のことを実行して Smith という LastName を持つ行を検索することができます。

  1. 行セットの RowSetMetaData オブジェクトを使用して、インデックス Last_Name を使用するようにアクセス パスを設定します。
    rsmd.setAccessPath("Last_Name"); 
    
  2. インデックス名を使用してインデックス オブジェクトを作成します。名前の代わりにインデックス番号を使用できます。
    Index index = rowset.createIndex("Last_Name");  
    
  3. インデックスに対して LastName 列のデータを設定します。
    index.setString("LastName", "Smith");  
    
  4. LastName = = Smith の最初の行を取得します。
    try { 
       Row row = rowset.getByIndex(Consts.BTR_EQ, index);  
    }  
    
  5. 発生する例外を把握します。
    catch(PsqlOperationException ex) {
    エラー コード = = 4 である場合、LastName = = Smith を持つ行は存在しません。これは、正常なオペレーションと見なすことができます。
    ステータス コードが 4 でない場合、「見つからない」以外の何らかの理由でオペレーションが失敗しています。
    if (ex.getErrorCode() != 4)
       throw(ex);  
    }  
    

インデックスが重複キー値を許可する場合は、比較演算子に適合する最初の行が返されます。返された行は現在の行になるので、インデックスに基づいて、行セットの getNext メソッドで次の論理行を取得できます。

テーブルの TableMetaData オブジェクトからインデックス名のリストを取得できます。

String [] index_names = 
table.getTableMetaData().getIndexNames(); 

インデックスに名前を付けなくてもよいことに注意してください。その場合、代わりにインデックス番号を使用してください。インデックス番号はゼロから始まります。

行の挿入、更新または削除

新しい行を挿入するには

  1. まず、新しい Row オブジェクトを作成します。
    Row row = rowset.createRow(); 
    
  2. 行の列データを設定します。
    // 列 0 のデータを設定する  
    row.setString(0, "Column0String");  
    // 列 1 のデータを設定する  
    row.setInt(1, 45);  
    // 列 2 のデータを更新する  
    row.setDouble(2, 99.99); 
    
  3. 次に行を挿入します。
    rowset.insertRow(row);
    この新たに挿入された行は、行セットの現在の行になります。行セットのカレンシーを挿入により変更したくない場合は、オーバーロード版の insertRow を使用できます。これは、カレンシー変更なし(NCC)を示すブール引数をとります。
    rowset.insertRow(row, true);
    行セットの現在の行は変更されません。

行またはレコードを更新するには

  1. まず、行セットの行取得メソッド、getNext、getByIndex などの 1 つを呼び出して、行を取得します。
    Row row = rowset.getNext(); 
    
  2. 行の列データを変更します。
    // 列 1 を更新する 
    row.setInt(1, 45); 
    
  3. 次に行を更新します。
    rowset.updateRow(row); 
    

次に示すように NCC(No-currency-change:カレンシー変更なし)が示されていない場合は、insertRow のように、新しく更新された行が行セットの現在の行になります。

rowset.updateRow(row, true); 

行またはレコードを削除するには

  1. まず、行セットの行取得メソッド、getNext、getByIndex などの 1 つを呼び出して、行を取得します。
    Row row = rowset.getNext(); 
    
  2. 次に行を削除します。
    rowset.deleteRow(row); 
    

削除する行は、現在の行、つまり、最終取得オペレーションから返された行である必要はありません。削除する行が現在の行でない場合、deleteRow メソッドはその行を現在の行にした後削除します。削除後、getNext を呼び出すと、その削除された行の後の行が返されます。

複数のオペレーションによるトランザクションへの結合

トランザクションを使用すると、一連のオペレーションを 1 つのオペレーションに結合し、これをコミットまたは中止することができます。

一連のオペレーションをトランザクションにするには

Session クラスのトランザクション メソッドを使用して、一連のオペレーションをトランザクションにすることができます。

次に、トランザクションの例を示します。

  1. トランザクションを開始します。
    try { 
      session.startTransaction(BTR_CONCURRENT_TRANS); 
    
  2. 障害が発生するとロールバックする、いくつかのオペレーションを実行します。
    // ここに 1 つまたは複数のオペレーションを追加する 
    
  3. トランザクションのコミットを試行します。
      session.commitTransaction(); }  
      catch(PsqlException ex)  
    
  4. エラーが検出されたら、トランザクションを中止します。
    { // エラーが発生  
    session.abortTransaction(); } 
    

トランザクションは「排他的」にすることも「並列」にすることもできます。トランザクションの詳細については、『Pervasive PSQL Programmer's Guide』を参照してください。

バイナリ ラージ オブジェクト(BLOB)の格納と取得

setObject()および getObject()メソッドは、java io Serializable インターフェイスを実装する Java オブジェクトを格納および取得するのに使用できます。setBinaryStream()および getBinaryStream()メソッドは、Java InputStreams を使用したバイナリ データの格納および取得に使用できます。次のインターフェイスを持つ「単純な」Employee オブジェクトがあるとします。

public class Employee implements java.io.Serializable 
public int    getID();       // Employee の ID を取得する 
public void   setID(int ID); // Employee の ID を設定する 
public String getName();     // Employee の名前を取得する 
public void   setName(String name); // Employee の名前を
設定する 
public String getManagerName(); //Manager の名前を取得する 
public void   setManagerName(); //Manager の名前を設定する 

また、C:¥Employees¥Java Duke¥report.txt というファイルが存在し、読み込めるとします。この場合、Employee オブジェクトのインスタンスを作成し、さまざまなメソッドを使用して設定を行い、データベースの Employee_Data 列に格納することができます。さらに、そのファイルを Manager_Report 列に格納することもできます。

//通常のセットアップ(Driver.establishSession など)および 
//employeeObject という名前の Employee オブジェクトの 
//インスタンスの作成は完了済み 
employeeObject.setName("Java Duke"); 
employeeObject.setID(123456789); 
employeeObject.setManagerName("Big Boss"); 
FileInputStream managerReport = null; 
try 
{ 
   managerReport = new FileInputStream(C:¥Employees¥Java 
Duke¥report.txt); 
} 
catch(IOException ioe) 
{ 
   // 例外処理 
} 
 
// その行の列値を設定する  
// RowSet object (行セット)が既に  
// 作成されているものとする 
 
Row employeeRow = rowset.createRow(); 
 
// データベースの ID 列を設定する 
employeeRow.setInt("ID", employeeObject.getID()); 
 
// Employee オブジェクトを行に設定する 
try 
{ 
   employeeRow.setObject("Employee_Data", 
employeeObject); 
} 
catch(PsqlIOException pioe) 
{ 
   // 例外処理 
} 
 
// マネージャーのレポートを行に設定する 
employeeRow.setBinaryStream("Manager_Report", 
managerReport); 
 
// 行を挿入する 
rowset.insertRow(employeeRow); 
 
// これで、データベースからこの行を取得することができる 
 
RowSetMetaData rsmd = rowset.getRowSetMetaData(); 
ColumnDef cdef = rsmd.getColumnDef("ID"); 
rsmd.addFirstTerm(cdef, Consts.BTR_EQ, "123456789"); 
Row rowRetrieved = rowset.getNext(); 
 
// 行の取得後、その行に getObject および getBinaryStream  
// メソッドを使用して目的のデータを取得することができる  
 
try 
{ 
   Employee employeeRetrieved =  
      (Employee)rowRetrieved.getObject("Employee_Data"); 
} 
catch(PsqlException pe) 
// このメソッドは PsqlIOException および 
// PsqlClassNotFoundException の両方をスローする 
{ 
   // 例外処理 
} 
 
InputStream reportRetrieved =  
   rowRetrieved.getBinaryStream("Manager_Report"); 
 
// これらのオブジェクトはこれで再構成された 
// オブジェクト自体または親オブジェクトに定義されたメソッドを 
// 起動することができる 
 
String managerName = 
employeeRetrieved.getManagerName(); 
 
// 通常はファイル全体を 1 つのチャンクで処理することは 
// あまりないが、リソースがあれば可能 
byte file[] = new byte[reportRetrieved.available()]; 
reportRetrieved.read(file); 

詳細については、バイナリ ラージ オブジェクトのサポートを参照してください。


Java アプリケーションにおける一連の手順

Java データ型の問題点