Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。TABLE文を生成するデータをコピーするテーブルおよびカタログ情報にアクセスするデータベースをコピーするには、データベースに関するカタログ情報を取得する必要があります。具体的には、データベースのテーブルのリストと、各テーブル内のすべての列のリストが必要になります。この情報に基づいて、DataMoverはデータのコピーに必要なSQL文を作成します。Databaseクラスには、データベースのすべてのテーブルのリストを返すlistTablesというメソッドがあります。JDBCでテーブルのリストを取得する方法はいくつかあります。多くのデータベースには、テーブルのリストを取得するためのストアドプロシージャやシステムテーブルが用意されています。ストアドプロシージャやシステムテーブルの名前はデータベースごとに異なるため、テーブルのリストを取得する場合はJavaクラスのDatabaseMetaDataを使うのが最も互換性の高い方法になります。このクラスは、テーブルの名前など、データベースに関する情報を提供します。listTablesメソッドは、まずテーブルリストを格納するコレクションを作成します。ArrayList<String>();次に、テーブルのリストを保持するResultSetを作成し、DatabaseMetaDataオブジェクトを取得します。connection.getMetaData();DatabaseMetaDataクラスにはたくさんのプロパティとメソッドがありますが、この例ではテーブルを取得するだけなので、getTablesメソッドを使います。このメソッドは3つの引数をとります。catalog文字列とschemaPattern文字列(この例ではどちらもnull)、および取得するテーブルの種類を示す文字列配列です。次の例では、"TABLE"という1つの要素を含む文字列配列を作成し、この配列を3つ目の引数としてgetTablesメソッドを呼び出しています。types);この場合のgetTablesメソッドは、すべてのテーブルのリストが含まれるResultSetを返します。後は、結果に対して繰り返し処理を行い、各テーブル名をresultコレクションに追加するだけです。DatabaseException(e));}finallyブロックを用意して、ResultSetが正しく閉じられるようにします。}}最後に、getTablesメソッドはテーブルのリストを返します。result;テーブルのリストを取得した後は、それらを処理してテーブル内の列のリストを取得します。TABLE文に加えて、現在のテーブルに適合するINSERT文とSELECT文も作成できるようになります。テーブルの列のリストを取得するために、DatabaseクラスにはlistColumnsメソッドが含まれています。このメソッドの処理はテーブルリストの取得と似ているので、詳しくは説明しません。データベースカタログ情報(テーブルと列)を取得したら、必要なSQL文を生成することができます。TABLE文を生成するルーチンは、さまざまな目的に利用できます。TABLE文を格納するためのStringBufferを作成します。[table]という文を作成して実行し、得られた結果からテーブル構造のメタデータを取得します。TABLEの部分を作成します。列は後から埋めることができます。TABLE文に追加します。TABLE文の列はコンマ区切りなので、最初の列を除き、各列名の後ろにコンマを追加する必要があります。');列の型を取得し、それを文の後ろに追加します。md.getPrecision(i));result.append(type);型の後に精度を指定する必要があります。Object)またはText型なので精度は不要です。ない場合は、精度と桁数を指定します。');型が数値で、種類が符号なしの場合は、UNSIGNED句を指定します。");}また、データ型がNULL値を受け付けるかどうかも指定します。auto_increment");}さらに、主キーを指定する必要があります。これはDatabaseMetaDataクラスを使って取得できます。主キーの列には、それを示す文字列を指定します。TABLE文は完成です。エラーが発生した場合は、DataMoverがDatabaseExceptionをスローします。TABLE文を文字列として返します。TABLE文を実行する前に、既存のコピー先データベースのテーブルを削除する必要があります。ないと、generateCreateメソッドはエラーをスローします。TABLE文を生成するgenerateDropメソッドが含まれています。データをコピーするコピー先データベースにテーブルを作成したら、そこにデータをコピーします。それには、SELECT文とINSERT文を作成する必要があります。SELECT文はコピー元データベースからテーブルのデータを読み取ります。INSERT文はコピー先データベースにデータを書き込みます。SELECT文、INSERT文、およびINSERT文のVALUES句を格納するための3つのStringBufferのインスタンスを作成します。StringBuffer();DataMoverは列を取得し、それぞれの状態を表示します。table);次に、SELECT文とINSERT文の先頭部分を作成します。");insertSQL.append(table);insertSQL.append("(");さらに、すべての列に対してループ処理を行い、SELECT文とINSERT文を作成します。最初の列名を除くすべての列名の後ろにコンマを挿入します。false;各文に列名を追加し、VALUES句に疑問符(?)を追加します。疑問符が必要なのは、パラメータ化されたSQLを使用しているからです。この部分を後から実際の値に置き換えます。文をこのように作成すると、データベースでINSERT文をプリコンパイルして時間を節約することができます。values.append("?");}次に、FROM句とVALUES句を追加します。(");insertSQL.append(values);insertSQL.append(")");ここまででSELECT文とINSERT文が完成し、SELECT文を実行してレコードのリストを取得できます。source.executeQuery(selectSQL.toString());サンプルでは、状態レポート用に行数をカウントしています。0;すべてのレコードに対してループ処理を行い、INSERT文を実行します。次に進むごとに値を増分します。rows++;それぞれのINSERT文に、個々の列データをコピーします。rs.getString(i));}その後、INSERT文を実行します。statement.execute();}最後に、状態情報を表示して終了します。最初に述べたように、このサンプルはデータベース間でデータをコピーする簡単なユーティリティですが、私はこれを、より大きなデータベースユーティリティを作成するための土台としてよく利用しています。このユーティリティには、もっと複雑なデータベースコピーアプリケーションを作成するために必要な多くの関数が含まれていることがわかるでしょう。1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。AI、仮想世界、スパイダー、ボットなどの話題を取り上げて執筆した書籍は10冊以上。Java、.Net、Silverlightを対象に、高度なニューラルネットワークおよびAIフレームワークの提供を目的とするオープンソースイニシアチブ、Encogプロジェクトを統括している。個人のWebサイトを管理し、人工知能とスパイダー/ボットプログラミングをはじめとする話題について情報発信を行っている。メールの宛先はjheaton@heatonresearch.com。Sun認定Javaプログラマ兼IEEEシニアメンバー。持ち、セントルイス在住。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。