Apache Derby を使用した開発 ― 3 連単を当てる: Apache Derby を使用した Java データベース開発、パート 4

動的なデータ変更

SQL カーソルの概要と、SQL カーソルを使用して Apache Derby データベースで動的にデータを変更する方法について学んでください。SQLカーソルは、ij ツールを使って明示的に使用することも、該当する Java™ メソッドを呼び出して暗黙的に使用することもできます。この機能をマスターすれば、ビジネス・アプリケーションに合わせて選択的にデータを変更可能なJava アプリケーションを作成できるようになれるはずです。

Robert Brunner, NCSA Research Scientist, Assistant Professor of Astronomy, University of Illinois, Urbana-Champaign

Robert J. BrunnerRobert J. Brunnerは、米国立スーパー・コンピューター応用研究所に科学者として勤務するかたわら、イリノイ大学アーバナ・シャンペーン校で天文学の助教授を務めています。何冊かの著作と、さまざまな分野にわたる数多くの記事や解説書を発表しています。連絡先はrb@ncsa.uiuc.eduです。



2007年 4月 17日

SQL カーソル

この連載の前回の記事では、Java の ResultSet の行を next() メソッドを使用して移動する方法を学びました。この手法は、Apache Derbyデータベースに付属の ij ツール内で SQL クエリーを実行したときの動作を正確に描写したものです。いずれの場合にしても、この機能はカーソルによってDerby データベース内 (あるいはその他の SQL 準拠データベース) に実装されます。カーソルとは、SQL クエリーの結果を繰り返し処理することを可能にするデータベース構造のことです。

Derby 内では明示的な方法でも、暗黙的な方法でも SQL カーソルを直接操作できます。明示的方法とは ij ツールを使って SQL コマンドを実行することで、暗黙的方法とはJDBC アプリケーション・プログラミング・インターフェース (API) の該当するメソッドを使用することです。この記事では、両方の方法を説明します。最初に説明するのは、ijツール内で明示的に SQL カーソルを使用する方法です。

まず初めに、リスト 1 のように ij ツールを起動してデータベースに接続します (注: スペースを節約するため、この記事に記載する Java ベースのサンプルはすべて簡略化しています)。各サンプルの完全なソース・コードは、記事の終わりにある「ダウンロード」セクションから入手できるアーカイブ・ファイルで提供されています。アーカイブ・ファイルには、実行可能な Derby スクリプト・ファイル、derby.build.sqlも含まれています (この記事に記載したサンプルで使用する実動 Derby データベースを作成するには、このシリーズの記事「Apache Derbyを使用した開発 -- 3連単を当てる : 第3回 Apache Derbyによるデータベース開発」を参照してください)。

リスト 1. Apache Derby ij ツールによる SQL カーソルの使用
                rb$ java org.apache.derby.tools.ij < derby.build.sql
...
rb$ java org.apache.derby.tools.ij
ij version 10.2
ij> CONNECT 'jdbc:derby:test' ;
ij>  AUTOCOMMIT OFF ;
ij> GET CURSOR productsCursor AS 
'SELECT * FROM bigdog.products FOR UPDATE OF price' ;
ij> NEXT productsCursor ;
ITEMNUMBER |PRICE  |STOCKDATE |DESCRIPTION                             
-----------------------------------------------------------------------
1          |19.95  |2006-03-31|Hooded sweatshirt                       
ij> UPDATE bigdog.products SET price = price * 1.10 WHERE CURRENT OF productsCursor ;
1 row inserted/updated/deleted
ij> CLOSE productsCursor ;
ij> SELECT * FROM bigdog.products WHERE itemNumber = 1 ;
ITEMNUMBER |PRICE  |STOCKDATE |DESCRIPTION                             
-----------------------------------------------------------------------
1          |21.94  |2006-03-31|Hooded sweatshirt                       

1 row selected
ij> ROLLBACK ;
ij> SELECT * FROM bigdog.products WHERE itemNumber = 1 ;
ITEMNUMBER |PRICE  |STOCKDATE |DESCRIPTION                             
-----------------------------------------------------------------------
1          |19.95  |2006-03-31|Hooded sweatshirt                       

1 row selected
ij> EXIT ;

リスト 1 のサンプルに示されているように、SQL カーソルを操作するには適切なデータベースが用意されていることが必要です。このサンプルではまず、サンプル・コードに提供されているDerby スクリプト (「ダウンロード・セクション」で入手可) を実行しています。ツールを起動して該当するデータベースに接続したら、次に AUTOCOMMIT モードを無効にします。AUTOCOMMIT モードはデフォルトで有効に設定されていますが、このモードが有効だと、データ変更プロセスを行うたびにコミット操作が実行され、それによってデフォルトでオープン・カーソルがクローズされます。そのため、位置を指定した更新または削除操作を実行するにはAUTOCOMMIT モードを無効にしなければなりません。注: カーソルで繰り返し処理しか行わないのであれば、AUTOCOMMIT モードを有効に設定したままでも構いません。

SELECT 文とカーソル更新

Apache Derby のカーソルを更新可能にするには、カーソルを構成するために使用する SELECT 文が以下のガイドラインに従っている必要があります。

  1. 単純な SELECT 文であること。AGGREGATE 関数、ORDER BYGROUP BY または HAVING 節、DISTINCT キーワードはいずれも使用できません。
  2. 単純な FROM 節を使用すること。FROM 節でリストできるのは 1 つのテーブルのみで、サブクエリーは使用できません。
  3. カーソル内の行を更新したい場合は、FOR UPDATE 節を含めること。FOR UPDATE 節の後に更新対象の列をリストするのは必須ではありませんが、いい考えです。明示的にすることが常にベスト・プラクティスだからです。

次のステップは、名前付きカーソルを作成することです。それには、カーソルの行を選択するのに必要な SQL クエリーと併せて GET CURSOR コマンドを使用します。Derby の標準カーソルは先頭の行から開始する前方スクロール・カーソルなので、NEXT コマンドを使用すれば行を順次ステップスルーできます。カーソル内で目的の行が見つかったら、該当するUPDATE 操作を行います。

上記のサンプルでは次に、カーソルをクローズして SELECT クエリーを実行し、変更された結果を表示しています。続いて実行した ROLLBACK コマンドによって変更が取り消されていますが、これが可能なのは、COMMIT コマンドを実行していないこと、そして AUTOCOMMIT モードが無効に設定されているためです。UPDATE 操作がデータベースにコミットされていないことを示すためにもう一度クエリーを実行したところ、元のとおりの結果が表示されています。

JDBC API の第 2 版では、新しい 2 つのカーソル・タイプ、スクロール・センシティブ・カーソルとスクロール・インセンシティブ・カーソルのサポートを開始しました。どちらのカーソルもスクロール可能で、カーソル内では順方向にも逆方向にも移動できます。さらに、相対移動も絶対移動も可能です。この2 つのタイプの違いは、カーソルがオープンされている間に行われた基礎データの変更に対応するかどうかという点です。センシティブ・カーソルは基礎データを動的に表示する一方、インセンシティブ・カーソルは一般的にカーソルがオープンされている間のデータベースの変更には対応しません。

バージョン 10.2 の Apache Derby がサポートするのは、スクロール・インセンシティブ・カーソルのみです。リスト 2 に示すように、このようなカーソルにはさまざまな興味深い操作方法があります。

リスト 2. Apache Derby ij ツールによるスクロール・インセンシティブ・カーソルの使用
                rb$ java org.apache.derby.tools.ij
ij version 10.2
ij> CONNECT 'jdbc:derby:test' ;
ij> AUTOCOMMIT OFF ;
ij> GET SCROLL INSENSITIVE CURSOR productsCursor AS 
'SELECT * FROM bigdog.products FOR UPDATE OF price' ;
ij> ABSOLUTE 5 productsCursor ;
ITEMNUMBER |PRICE  |STOCKDATE |DESCRIPTION                             
-----------------------------------------------------------------------
5          |49.95  |2006-02-20|Female bathing suit, one piece, aqua    
ij> relative -1 productsCursor ;
ITEMNUMBER |PRICE  |STOCKDATE |DESCRIPTION                             
-----------------------------------------------------------------------
4          |29.95  |2006-02-10|Male bathing suit, blue                 
ij> BEFORE FIRST productsCursor ;
No current row
ij> NEXT productsCursor ;
ITEMNUMBER |PRICE  |STOCKDATE |DESCRIPTION                             
-----------------------------------------------------------------------
1          |19.95  |2006-03-31|Hooded sweatshirt                       
ij> UPDATE bigdog.products SET price = price * 1.10 WHERE CURRENT OF productsCursor ;
1 row inserted/updated/deleted
ij> NEXT productsCursor ; 
ITEMNUMBER |PRICE  |STOCKDATE |DESCRIPTION                             
-----------------------------------------------------------------------
2          |99.99  |2006-03-29|Beach umbrella                          
ij> PREVIOUS productsCursor ;
ITEMNUMBER |PRICE  |STOCKDATE |DESCRIPTION                             
-----------------------------------------------------------------------
ERROR XJ001: Java exception: ': java.lang.NullPointerException'.
ij> CLOSE productsCursor ;
ij> SELECT * FROM bigdog.products WHERE itemNumber = 1 ;
ITEMNUMBER |PRICE  |STOCKDATE |DESCRIPTION                             
-----------------------------------------------------------------------
1          |21.94  |2006-03-31|Hooded sweatshirt                       

1 row selected
ij> ROLLBACK ; 
ij> SELECT * FROM bigdog.products WHERE itemNumber = 1 ;
ITEMNUMBER |PRICE  |STOCKDATE |DESCRIPTION                             
-----------------------------------------------------------------------
1          |19.95  |2006-03-31|Hooded sweatshirt                       

1 row selected
ij> EXIT ;

このサンプルと最初のサンプルとの違いは、このサンプルではスクロール・インセンシティブ・カーソルを使用しているという点だけです。このサンプルではij ツールを使って、データベースに接続し、AUTOCOMMIT モードを無効に設定し、続いてスクロール・インセンシティブ・カーソルを作成し、そして、表 1 にリストする基本的な SQL カーソル操作コマンドの使用方法について学びます。まず、ABSOLUTE コマンドでカーソルの 5 行目に移動し、それから RELATIVE コマンドで 1 行戻します (つまり、カーソルは 4 行目にあることになります)。次に、BEFORE FIRST コマンドでカーソルを先頭行の前に配置し、NEXT コマンドを呼び出してカーソルの先頭行にアクセスします。

この時点で SQL の UPDATE 操作を実行して現在行を変更し、2 行目に移動します。最後に先頭行に戻って更新済みのコンテンツを表示しようとしますが、現在行はもはや存在しないためNullPointerException を受け取っています。つまり先頭行は変更済みで、その変更は現行のカーソルには反映されていないためです。更新された行を表示するには、カーソルをクローズして新しい結果を表示するためのクエリーを発行しなければなりません。そこで、ROLLBACK コマンドで変更を取り消し、オペレーティング・システムに戻ります。

表 1. Apache Derby での基本的な SQL カーソル操作コマンド
ij コマンド説明
NEXT nameNEXT productsCursorカーソルの次の行を取得する
FIRST nameFIRST productsCursorカーソルの先頭行を取得する
LAST nameLAST productsCursorカーソルの最後の行を取得する
PREVIOUS namePREVIOUS productsCursorカーソルの前の行を取得する
ABSOLUTE int nameABSOLUTE 1 productsCursor指定した行番号 (負の整数は、最後の行から逆方向で指定する) にカーソルを配置する
RELATIVE int nameRELATIVE 1 productsCursor現在行からの行数 (負の数値は、カーソル内で逆方向に数える) を設定して、カーソルを新しい行に配置する
AFTER LAST nameAFTER LAST productsCursorカーソルを最後の行の後に配置する
BEFORE FIRST nameBEFORE FIRST productsCursorカーソルを先頭行の前に配置する
GETCURRENTROWNUMBER nameGETCURRENTROWNUMBER productsCursorカーソルの現在行の行番号を戻す
CLOSE nameCLOSE productsCursorカーソルをクローズする

更新可能な ResultSet

Apache Derby データベース・スイート全体は Java 言語で作成されているため、当然のことながら、更新可能な ResultSet を作成して、該当する JDBC メソッドを呼び出せば、独自の Java アプリケーションに ij で更新可能なカーソル機能を複製することができます。JDBCAPI にはスクロール可能な ResultSet 内での移動に使用できるメソッドが多数組み込まれています (前方スクロールの ResultSet 内で移動するには、next() メソッドを使用します)。next()previous()absolute()relative()beforeFirst() などの重要度の高いメソッドは、表 1 にリストした ij コマンドに適合します。

以降のセクションでは、JDBC API を使って ResultSet に対して選択的にデータを更新する方法、削除する方法、そして新規データを挿入する方法を説明します。いずれのサンプルでも単純にするために単一方向のカーソルを使用していますが、ResultSet を前方にも後方にもプログラマチックに移動できるスクロール可能カーソルを使用するようにサンプルを変更するのも簡単です。

行の更新

ご想像のとおり、ビジネスで共通して必要なことと言えば、ResultSet 内の行を繰り返し処理しながら特定の列の値を変更することです。例えば、製品を販売した後や価格を更新した後に、商品の在庫状態に従ってインベントリー内の商品数を更新しなければならないとします。リスト3 に示すように、更新可能な ResultSet を使用すると、このプロセスは比較的簡単なものになります。

リスト 3. Apache Derby データベースでの Java コードを使った行の更新
                BigDecimal itemPrice ;
BigDecimal multiplier = new BigDecimal("0.90") ;

Date itemDate ;
Date updateDate = Date.valueOf("2006-1-01") ;

String sql = "SELECT itemNumber, price, stockDate, description FROM bigdog.products" ;

Statement stmt = con.createStatement(
    ResultSet.TYPE_FORWARD_ONLY, 
    ResultSet.CONCUR_UPDATABLE) ;

ResultSet uprs = stmt.executeQuery(sql) ;

while(uprs.next()){
    itemDate = uprs.getDate("stockDate") ;
    if (itemDate.before(updateDate)){
        itemPrice = uprs.getBigDecimal("price") ;
        itemPrice = itemPrice.multiply(multiplier) ;
        uprs.updateBigDecimal("price", itemPrice) ;
        uprs.updateRow() ;
    }
}

uprs.close() ;
stmt.close() ;

このサンプル・コードでは、実際のビジネス環境で売れ行きの悪い在庫品を一掃するために行うように、bigdog.products テーブルに含まれる古いすべての商品の価格を 90 パーセントまで引き下げています。データベースでこのプロセスを実現するには、まず、テスト条件と更新プロセスの両方を決定するのに適切な変数を定義しなければなりません。つまり、Date 値と BigDecimal 値の両方が必要となります。

トランザクションがオープンした状態での接続のクローズ

AUTOCOMMIT モードを、例えば setAUTOCOMMIT(false) を呼び出して無効にした場合、接続をクローズしようとすると Apache Derby が SQL 例外をスローすることがあります。その原因としては、SQLクエリーや更新操作などによってトランザクションがオープン状態になっていることが考えられます。オープン状態のトランザクションは、接続をクローズする前にクローズしなければなりません。この例外が発生しないようにするため、JDBCデータベース接続でclose()を呼び出す前には必ず、どの接続でも commit() または rollback() を呼び出して、オープンしている可能性のあるすべてのトランザクションを正しくクローズしてください。

次に、更新可能な ResultSet を作成します。これは、ij ツールで GET CURSOR コマンドを使用するのと同じことです。更新可能な ResultSet を作成するための Java コードを書く場合に、変更しなければならない点は、2 つのパラメーターを createStatement() メソッドに渡すということだけです。最初のパラメーターでカーソルが単一方向 (TYPE_FORWARD_ONLY) または双方向 (TYPE_SCROLL_INSENSITIVE) のどちらであるかを指定し、2 番目のパラメーターで読み取り専用 (CONCUR_READ_ONLY) であるか、または更新可能 (CONCUR_UPDATABLE) であるかを指定します。どちらのパラメーターも createStatement() メソッドに渡されない場合はデフォルトで、単一方向、読み取り専用の ResultSet が作成されます。したがって、createStatement() メソッドにパラメーターを渡す必要があるのは、スクロール可能なカーソル、あるいは更新可能な ResultSet のいずれかが必要な場合に、Derby データベースを操作する Java コードを作成するときだけということになります。

更新可能な ResultSet を作成した後、変更対象の行が見つかるまで行を繰り返し処理します。このサンプルで変更対象としているのは、stockDate が 2006年1月1日よりも前になっているすべての行です。行を見つけたら、適切な updateXXX()メソッドを呼び出します。XXX は、該当する Java データ型です (BigDecimal など)。これらの update メソッドが使用する 2 つのパラメーターは、一方が更新する列番号または名前、そしてもう一方が列の新しい値です。上記のサンプルではprice 列を更新し、updateRow() メソッドを呼び出して行の更新が完了したことを示しています。この時点では、行の更新はデータベースに永続的に書き込まれません。データベースに書き込まれるのは現行のトランザクションがコミットされた時点となりますが、通常は現行のトランザクション内で更新が表示されます。

行の削除

更新可能な ResultSetから行を削除するには、リスト 4 に示すように deleteRow() メソッドを呼び出します。

リスト 4. Apache Derby データベースでの Java コードによる行の削除
                Date itemDate ;
Date updateDate = Date.valueOf("2006-1-01") ;

String sql = "SELECT itemNumber, price, stockDate, description FROM bigdog.products" ;

Statement stmt = con.createStatement(
    ResultSet.TYPE_FORWARD_ONLY, 
    ResultSet.CONCUR_UPDATABLE) ;

ResultSet uprs = stmt.executeQuery(sql) ;
        
while(uprs.next()){
    itemDate = uprs.getDate("stockDate") ;
    if (itemDate.before(updateDate)){
        uprs.deleteRow() ;
    }
}

uprs.close() ;
stmt.close() ;

上記のサンプルを見れば、データベースから選択的に行を削除することによって、製品インベントリーから古い商品を除去する方法が分かるはずです。ここで具体的に削除しているのは、bigdog.products テーブルで stockDate 列の値が 2006年1月1日より前になっているすべての行です。削除方法として、更新可能な ResultSet を作成し、カーソルを行で繰り返して適宜 deleteRow() メソッドを呼び出しています。この変更は現行トランザクションの領域内ではすぐに行われますが、行がデータベースから削除されるのは現行のトランザクションがコミットされた時点となります。

行の挿入

SQL データ変更操作のなかでは、データの挿入が最も複雑です。新しいデータのために新しく保管領域を確保しなければならないこと、そして新しいデータを正しくエンコードしなければならないことがその理由です。JDBC標準では、リスト 5 に示すとおりの、この的確なレシピに従って更新可能な ResultSet へのデータ挿入をサポートします。ここでの重要な概念は、ResultSetに導入された挿入行と呼ばれる新しい特殊な行です。データベースへの行の挿入を準備する間、この行を使用して新しいデータを保持します。

リスト 5. Apache Derby データベースでの Java コードによる行の挿入
                int itemNumber = 11 ;
BigDecimal price = new BigDecimal(99.99) ;
Date stockDate = Date.valueOf("2006-12-07") ;
String description = "Board carrying bag" ;

String sql = 
    "SELECT itemNumber, price, stockDate, description FROM bigdog.products" ; 

Statement stmt = con.createStatement(
    ResultSet.TYPE_FORWARD_ONLY, 
    ResultSet.CONCUR_UPDATABLE) ;

ResultSet uprs = stmt.executeQuery(sql) ;

uprs.moveToInsertRow();
uprs.updateInt("itemNumber", itemNumber);
uprs.updateBigDecimal("price", price) ;
uprs.updateDate("stockDate", stockDate) ;
uprs.updateString("description", description) ;
uprs.insertRow();

uprs.close() ;
stmt.close() ;

このサンプルでは、まずデータベースに追加する基本データを作成しています。実際には、このデータは Web フォームを介してユーザーから取得するか、あるいは発注書や納品書の一部としてサプライヤーから取得することになるはずです。次に更新可能な ResultSet を作成します。これで新しい行を挿入する準備が整ったので、今度は moveToInsertRow() メソッドを呼び出して、カーソルを特殊な挿入行に移動させます。カーソルを挿入行に配置したら、その行の列が新規データ値を保持するように更新し、insertRow() メソッドを呼び出して新しい値を保管するよう指示します。

トランザクション内で新しいクエリーを実行すると、新しい行が表示されます。これは、このトランザクションが新しい行のロックを保持しているためで、他のユーザーにはトランザクションがコミットされるまで新しい行は表示されません。新しい行が bigdog.products テーブルに永続的に保管されていない理由は、AUTOCOMMIT を無効にして操作しているからです。もう 1 つ重要な点として、新しい行を挿入した後も、更新可能な ResultSet は引き続き操作できます。それには、moveToCurrentRow() メソッドを呼び出して、基礎となるデータベース・カーソルを ResultSet 内の現在行に戻します。するとカーソルは、挿入行に移動する前に配置されていた ResultSet 内の行に戻ります。上記のサンプルでカーソルが配置されていたのは先頭行の前なので、next() メソッドを呼び出すと ResultSet 内の先頭行が取得されます。


位置を指定した更新

JDBC API の柔軟性を利用して、適切な SQL コマンドを発行することによって、位置を指定した更新や削除をプログラマチックに実行するためのカーソルを作成することもできます。この機能を使用するには、リスト6 に示すようにデータベース・カーソルを名前で参照します。

リスト 6. Apache Derby データベースでの Java コードによる位置を指定した更新
         con.setAutoCommit(false) ;

Statement stmt = con.createStatement() ;

stmt.setCursorName("PRODUCTSCURSOR") ;

String usql = "SELECT itemNumber, price, stockDate, description " + "" +
    "FROM bigdog.products FOR UPDATE of price, stockDate" ;

ResultSet uprs = stmt.executeQuery(usql) ;

String updateProductsSQL = 
    "UPDATE bigdog.products SET price = ?, stockDate = CURRENT_DATE " +
    "WHERE CURRENT OF " + uprs.getCursorName() ;

PreparedStatement pstmt = con.prepareStatement(updateProductsSQL) ;

このサンプルは、これまでの Java サンプルとは違って見えます。それは、SQL コマンドを埋め込んで、作業のほとんどを実行させているためです。サンプルでは最初にAUTOCOMMIT を無効にして、変更が自動的にデータベースに適用されないようにしています。これは、特定のトランザクション内で複数のクエリー (必要な SQLコマンドそれぞれに対するクエリー) を実行する上で重要なポイントとなります。AUTOCOMMIT が有効になっていると (デフォルトの動作)、それぞれのクエリーが単一のトランザクションで実行されることになるからです。

Derby でのカーソル名

リスト 6 のような位置を指定した更新操作を使用している場合、カーソルには独自の名前を割り当てることも、Apache Derby に自動的に名前を割り当てさせることもできます。一般的に推奨するのは、getCursorName() メソッドで取得できる名前を Derby に割り当てさせることです。一方、setCursorName() メソッドを使ってカーソルに名前を割り当てる場合は、名前をすべて大文字にすることをお勧めします。そうでないと、String の大/小文字の不一致が原因で、対象のカーソルが見つからないという SQL 例外がアプリケーションで発生する可能性があります。

次のステップは、該当する SQL クエリーを実行して更新可能なカーソルを作成することです。それには前述した FOR UPDATE 節を使用する必要があります。続いて SQL コマンドを作成し、WHERE CURRENT OF 節を使った SQL UPDATE 文で対象の行を更新します。WHERE CURRENT OF 節は、getCursorName() メソッドを呼び出して明示的にカーソルの名前を取得することにより完結します。この名前は、上記のサンプルのように setCursorName() メソッドを呼び出して明示的に設定することも、あるいはデータベースが定義する名前を使用することもできます。いずれの方法にしても、getCursorName() メソッドを正しい ResultSet 上で呼び出すと正しい名前が取得されます。

お気付きかもしれませんが、リスト 6 では SQL UPDATE コマンドに対して作成した PreparedStatement をまったく実行していません。PreparedStatement に値を設定してから SQL UPDATE コマンドを実行することによって、読み取り専用 ResultSet を繰り返し処理して該当する行を更新する方法については、ソース・コードに記載されている完全なリストを参照してください。


まとめ

この記事では、Apache Derby データベースで動的にデータを変更するために使えるいくつかのコンセプトを紹介しました。まず初めに説明したのは、明示的にSQL カーソルを操作する方法です。この方法では、ij ツールを使用して単一方向のカーソルとスクロール可能な SQL カーソルの両方を作成し、それからカーソル内を移動して選択的にデータ変更操作を実行します。次に説明したのは、同じような機能を今度はJava プログラム内から可能にする方法です。それには、更新可能な ResultSet を作成します。そして最後に、この 2 つの方法を混ぜ合わせて、位置を指定した更新と削除を実行する方法を説明しました。

連載のこれまでの記事で、皆さんは重要な段階に達したことになります。つまり、クエリーを実行して結果を処理し、Java プログラム内から動的に ApacheDerby データベースを更新できるようになったということです。次に進むべきステップとして、今後の記事で高度な Java クエリーのコンセプトをいくつか学び、組み込みApache Derby データベースが含まれる Java アプリケーションを作成してデプロイする能力を身に付けてください。次回をお楽しみに。


ダウンロード

内容ファイル名サイズ
Derby SQL script and Java code for this articlederby12.zip7KB

参考文献

学ぶために

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology, Information Management
ArticleID=247881
ArticleTitle=Apache Derby を使用した開発 ― 3 連単を当てる: Apache Derby を使用した Java データベース開発、パート 4
publish-date=04172007