アプリケーション開発の手引き


JDBC プログラミング

アプリケーションとタスクは両方とも、通常は以下のタスクを実行します。

  1. 適切な Java パッケージとクラスをインポートする (java.sql.*)。
  2. 適切な JDBC ドライバーをロードする (アプリケーションの場合、COM.ibm.db2.jdbc.app.DB2Driver。アプレットの場合、 COM.ibm.db2.jdbc.net.DB2Driver)。
  3. データベースへの接続。 Sun 社の JDBC 仕様書で定義されている URL でロケーションを指定し、 db2 サブプロトコルを使用します。アプレットの場合は、アプレット・サーバー用のユーザー ID、パスワード、ホスト名、およびポート番号を指定する必要があります。明示的に代替値を指定しない場合、アプリケーションは、 DB2 クライアント・カタログからユーザー ID とパスワードの省略時値を暗黙的に使用します。
  4. SQL ステートメントをデータベースに渡す。
  5. 結果を受信する。
  6. 接続をクローズする。

プログラムをコーディングした後、他のすべての Java プログラムのようにコンパイルします。何らかの特別なプリコンパイルまたはバインド・ステップを実行する必要はありません。

DB2Appl プログラムの実行方法

以下のサンプル・プログラム DB2Appl.java は、 DB2 に JDBC プログラムをコーディングする方法を示しています。

  1. JDBC パッケージをインポートする。すべての JDBC および SQLJ プログラムは、JDBC をインポートしなければなりません。
  2. 接続オブジェクトを宣言する。 接続オブジェクトは、データベース接続を確立して管理します。
  3. データベース URL 変数を設定する。 DB2 アプリケーション・ドライバーは、 jdbc:db2:>database-name< の形式の URL を受け入れます。
  4. データベースに接続するDriverManager.getConnection() 方式は、以下のパラメーターを指定して使用されるのが一般的です。

    getConnection(String url)
    省略時ユーザー ID およびパスワードを指定して、 url で指定されるデータベースへの接続を確立します。

    getConnection(String url, String userid, String password)
    userid および passwd でそれぞれ指定されるユーザー ID およびパスワードの値を使用して、 url で指定されるデータベースへの接続を確立します。
  5. ステートメント・オブジェクトを作成する。ステートメント・オブジェクトは、SQL ステートメントをデータベースに送信します。
  6. SQL SELECT ステートメントを実行する。 SQL ステートメントに対して executeQuery() 方式を使用します。 SELECT ステートメントと同様に、これは単一の結果セットを戻します。この結果を ResultSet オブジェクトに割り当てます。
  7. ResultSet から行を検索する。 ResultSet オブジェクトを使用すると、 SQL に組み込まれるホスト言語で結果セットをカーソルのように扱うことができます。 ResultSet.next() 方式では、次の行にカーソルを移動し、結果セットで最終行になると、boolean false を戻します。結果セット処理の制限事項は、データベース・マネージャー構成パラメーターにより使用可能にされた JDBC API のレベルによって異なります。
  8. 列の値を戻すResultSet.getString(n) は、 nth 列の値を String オブジェクトとして戻します。
  9. SQL UPDATE ステートメントを実行する。 SQL UPDATE ステートメントに対して executeUpdate() 方式を使用します。この方式では、更新された行数を int 値として戻します。

JDBC の例: DB2Appl.java

import java.sql.*; (1) 
class DB2Appl {
   static {
      try {
         Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();
      } catch( Exception e ) {
         System.out.println(e);
      }
   }
   public static void main(String argv[]) {
      Connection con = null; (2)
      // URL is jdbc:db2:dbname
      String url = "jdbc:db2:sample"; (3)
      try {
         if (argv.length == 0) {
            // connect with default id/password
            con = DriverManager.getConnection(url);
            }
         else if (argv.length == 2) {
            String userid = argv[0];
            String passwd = argv[1];
            // connect with user-provided username and password
            con = DriverManager.getConnection(url, userid, passwd); (4)
            }
         else {
            System.out.println("Usage: java DB2Appl [username password]");
            System.exit(0);
         }
         // retrieve data from the database
         System.out.println("Retrieve some data from the database...");
         Statement stmt = con.createStatement(); (5)
         ResultSet rs = stmt.executeQuery("SELECT * from employee"); (6)
         System.out.println("Received results:");
         // display the result set
         // rs.next() returns false when there are no more rows
         while (rs.next()) { (7)
            String a = rs.getString(1); (8)
            String str = rs.getString(2);
            System.out.print(" empno= " + a);
            System.out.print(" firstname= " + str);
            System.out.print("");
         }
         rs.close();
         stmt.close();
         // update the database
         System.out.println("Update the database... ");
         stmt = con.createStatement();
         int rowsUpdated = stmt.executeUpdate("UPDATE employee
	        SET firstnme = 'SHILI' where empno = '000010'");(9)
         System.out.print("Changed "+rowsUpdated);
         if (1 == rowsUpdated)
            System.out.println(" row.");
         else
            System.out.println(" rows.");
         stmt.close();
         con.close();
      } catch( Exception e ) {
         System.out.println(e);
      }
   }
}

JDBC アプリケーションの配布

JDBC アプリケーションの配布は、他のすべての Java アプリケーションの場合と同様に行います。アプリケーションは DB2 サーバーとの通信に DB2 クライアントを使用するため、機密保護についての考慮事項は特にありません。権限に関する検査は DB2 クライアントにより実行されます。

クライアント・マシン上でアプリケーションを実行するには、そのマシンに以下のものをインストールしなければなりません。

アプリケーションを作成するには、ご使用のオペレーティング・システムに JDK もインストールしなければなりません。 Java 環境の設定、DB2 Java アプリケーションの作成、および DB2 Java アプリケーションの実行の詳細については、 アプリケーション構築の手引き を参照してください。

JDBC アプレットの配布および実行

他の Java アプレットと同様に、 JDBC アプレットは、ネットワーク (イントラネットまたはインターネット) を介して配布します。一般的にアプレットは、ハイパーテキスト・マークアップ言語 (HTML) のページに組み込まれます。たとえば、サンプル・アプレット DB2Applt.java (sqllib/samples/java にある) を呼び出すためには、次の <APPLET> タグを使用します。

   <applet code="DB2Applt.class" width=325 height=275 archive="db2java.zip">
      <param name="server" value="webhost">
      <param name="port" value="6789">
   </applet>

アプレットを実行するには、クライアント・マシンに Java を使用できる Web ブラウザーだけが必要です。 HTML ページをロードするときには、アプレット・タグは、ご使用のブラウザーが Java アプレットおよび db2java.zip クラス・ライブラリーをダウンロードするように指示します。これには、COM.ibm.db2.jdbc.net クラスによりインプリメントされた DB2 JDBC ドライバーも含まれます。アプレットが DB2 に接続するために JDBC API を呼び出す場合、 JDBC ドライバーは Web サーバーで稼働している JDBC アプレット・サーバーを介して、 DB2 データベースと分割接続します。
注:Web ブラウザーがサーバーから db2java.zip を確実にダウンロードできるようにするには、クライアント上の CLASSPATH 環境変数に db2java.zip が含まれない ようにします。クライアントが db2java.zip のローカル・バージョンを使用している場合、ご使用のアプレットは正常に機能しない場合があります。

Java アプレットの作成および配布の詳細については、 アプリケーション構築の手引き を参照してください。

JDBC 2.0

JDBC 2.0 は、Sun 社の JDBC の最新のバージョンです。このバージョンの JDBC には、 コア APIオプション・パッケージ API の、2 つのパーツが定義されています。 JDBC 仕様の詳細については、 DB2 ユニバーサル・データベース Java Web サイトを参照してください。

ご使用のオペレーティング・システムに応じて JDBC 2.0 ドライバーをインストールする方法について詳しくは、 アプリケーション構築の手引き を参照してください。

JDBC 2.0 コア API サポート

DB2 JDBC 2.0 ドライバーは JDBC 2.0 コア API をサポートしますが、仕様で定義されているすべての機能をサポートするわけではありません。 DB2 JDBC 2.0 ドライバーは、以下の JDBC 2.0 コア API 機能をサポートします。

注:DB2 は、ストアード・プロシージャー、UDF、またはメソッドでの java.sql.Blob または java.sql.Clob はサポートしていません。

DB2 JDBC 2.0 ドライバーは、以下の機能はサポートしていません。

JDBC 2.0 オプション・パッケージ API サポート

DB2 JDBC 2.0 ドライバーは、以下の JDBC 2.0 オプション・パッケージ API 機能をサポートします。

命名データベース用 Java Naming and Directory Interface (JNDI)

DB2 では、命名データベース用 Java Naming and Directory Interface (JNDI) の以下のサポートが提供されています。

javax.naming.Context
このインターフェースは、 DataSource オブジェクトの記憶域と検索を処理する COM.ibm.db2.jndi.DB2Context によってインプリメントされます。論理データ・ソース名と物理データベース情報 (データベース名など) の永続的な関連をサポートするため、これらの関連は .db2.jndi という名前のファイルに保管されます。アプリケーションの場合、このファイルは USER.HOME 環境変数で指定したディレクトリーに常駐します (または、存在していなければ作成されます)。アプレットの場合、lookup() 操作を円滑に行うためには、このファイルを Web サーバーのルート・ディレクトリーに作成する必要があります。アプレットは、このクラスの bind()rebind()unbind()、および rename() メソッドはサポートしません。アプリケーションが行うことができるのは、 DataSource オブジェクトの JNDI へのバインドだけです。

javax.sql.Datasource
このインターフェースは、 COM.ibm.db2.jdbc.DB2DataSource によってインプリメントされます。このクラスのオブジェクトは、 javax.naming.Context をインプリメントする際に保管することができます。このクラスは、接続プールのサポートにも利用できます。

javax.naming.InitialContextFactory
このインターフェースは、 DB2Context のインスタンスを作成する COM.ibm.db2.jndi.DB2InitialContextFactory によってインプリメントされます。アプリケーションは、JAVA.NAMING.FACTORY.INITIAL 環境変数の値を自動的に COM.ibm.db2.jndi.DB2InitialContextFactory に設定します。このクラスをアプレットで使用するには、以下の構文を使用して InitialContext() を呼び出します。

  Hashtable env = new Hashtable( 5 );
  env.put( "java.naming.factory.initial",
           "COM.ibm.db2.jndi.DB2InitialContextFactory" );
  Context ctx = new InitialContext( env );

接続プール

DB2ConnectionPoolDataSource および DB2PooledConnection は、ユーザー独自の接続プールをインプリメントするのに必要なフックを提供します。以下のとおりです。

javax.sql.ConnectionPoolDataSource
このインターフェースは、 COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource によってインプリメントされ、 COM.ibm.db2.jdbc.DB2PooledConnection オブジェクトを制作する場所になります。

javax.sql.PooledConnection
このインターフェースは、 COM.ibm.db2.jdbc.DB2PooledConnection によってインプリメントされます。

Java トランザクション API (JTA)

DB2 は、DB2 JDBC アプリケーション・ドライバーを使って Java トランザクション API (JTA) をサポートします。 DB2 は、DB2 JDBC ネット・ドライバーを使った JTA はサポートしません。

javax.sql.XAConnection
このインターフェースは、 COM.ibm.db2.jdbc.DB2XAConnection によってインプリメントされます。

javax.sql.XADataSource
このインターフェースは、 COM.ibm.db2.jdbc.DB2XADataSource によってインプリメントされ、 COM.ibm.db2.jdbc.DB2PooledConnection オブジェクトを制作する場所になります。

javax.transactions.xa.XAResource
このインターフェースは、 COM.ibm.db2.jdbc.app.DBXAResource によってインプリメントされます。

javax.transactions.xa.Xid
このインターフェースは、 COM.ibm.db2.jdbc.DB2Xid によってインプリメントされます。

JDBC 2.0 互換性

この仕様のバージョンは、以前のバージョン (1.22) と下位互換性があります。ただし、DB2 JDBC 1.22 ドライバーは、 LOB タイプを JDBC 1.22 仕様の拡張としてサポートします。この拡張は、新しい仕様の下位互換性には含まれません。つまり、JDBC 1.22 ドライバーの LOB サポートに依存している既存の JDBC アプリケーションは、新しいドライバーでは正常に実行しない可能性があるということです。 LOB およびグラフィック・タイプの DB2 JDBC 1.22 ドライバー・サポートの詳細については、 JDBC 1.22 で LOB およびグラフィカル・オブジェクトを使用するを参照してください。問題を訂正するため、 JDBC 2.0 ドライバーが提供する LOB サポートを利用するようアプリケーションを変更することを検討してください。
注:ストアード・プロシージャーや UDF の LOB および漢字タイプ用の DB2 JDBC 2.0 ドライバー・サポートは使用できません。ストアード・プロシージャーや UDF の LOB または漢字タイプを使用するには、 JDBC 1.22 ドライバー・サポートを使用する必要があります。

ただし、この解決が、すべての状況で実際的だというわけではありません。対処方法として、キーワード JDBCVERSION を "122" に設定すると、 JDBC 2.0 ドライバーが LOB サポートの 1.22 バージョンを使用するように指示できます。省略時値は "200" で、 JDBC 2.0 ドライバーが LOB サポートの 2.0 バージョンを使用するように指示します。このキーワードは db2cli.ini で設定することも、 getConnection 特性引き数に接続属性として設定することもできます。
注:JDBC 1.22 ドライバーを使用する場合は、 JDBCVERSION キーワードを設定しても JDBC の LOB サポートには影響を与えません。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]