第5回 データベースのブラウザを作る

丸山不二夫
稚内北星学園大学学長
(http://www.wakhok.ac.jp/)
2001/7/24

 今回は、Webコンポーネントを含むJ2EEアプリケーションを作ってみようと思います。正確にいえば、今回のアプリケーションにはWebコンポーネントしか含まれていません。トランザクション処理が問題になるような大規模なものでなければ、JSPだけでもいろいろなアプリケーションの開発が可能です。deploytoolの使い方も見てみようと思います。作成済みのアプリケーション(systables.ear)はここからダウンロードできます。

 テーブル・ブラウザを作る


 最初に、今回紹介するテーブル・ブラウザの機能を見ておきましょう。ページの先頭に2つのプルダウン・メニューがあります。左側のメニューには、接続しているデータベースのテーブルの名前の一覧が表示され、テーブルを選ぶことができます(図1)

図1 今回作成するテーブル・ブラウザ

図2 Attributesを表示したところ

 右側のメニューには、ContentsAttributesという2つのオプションがあり、Contentsを選べば指定したテーブルの内容が表示され、Attributesを選べば、テーブルを構成する項目についての情報が得られます(図2)。今回は、J2EEと一緒に提供されているJava Pet Storeデモのデータをサンプルとして使っていますが、このテーブル・ブラウザの機能は汎用的なものです。

 

 データベースのシステム・テーブルを読む

 このアプリケーションでは、データベースに対して3つの種類の検索が行われることになります。第1は、データベース中のすべてのテーブルの一覧を作る検索です。この結果はテーブル名を表示するプルダウン・メニューの作成に利用されます。第2の検索は、テーブル名が指定されてContentsオプションが選ばれた場合で、第3の検索は、Attributesオプションが選ばれた場合です。これらのうち、第1と第3の検索では、一般のユーザーが定義したテーブルではない、データベースのシステム・テーブルを利用することになります。

 

 データベース中の
  すべてのテーブルの一覧を作る

 まず、データベース中のテーブル一覧の作り方を見てみましょう。今回は、データベースとしてJ2EEと一緒に提供されている「Cloudscape」を例にして説明していますが、OracleでもSybaseでも、PostgreSQLでも同じような処理が可能なので、これらのデータベースを利用している人は、ぜひ、挑戦してみてください。

 Cloudscapeでは、テーブルの情報はSYSTABLESというテーブルに格納されています。たいていのデータベースにはこのテーブルがあるはずです。Cloudscapeでは、テーブル名は正式には、スキーマ名+"." +テーブル名という形で管理されています。例えば、このSYSTABLESというテーブルの正式名称は、このテーブルの所属するSYSスキーマの名前で修飾された、SYS.SYSTABLESということになります。Cloudscape内のテーブルを一意に指定するためには、スキーマ名で修飾された正式なテーブル名が必要ですので、汎用的なツールとしては、スキーマ名付きでテーブル名を獲得しようと思います。

 

 2つのテーブルのジョインとAliasの利用

 文字列としてのスキーマ名は、実は、SYSTABLESにはなくてSYSSCHEMASというテーブルにあります。この2つのテーブルは、SCHEMAIDという項目を共有しています。ですから、次のようなSELECT文で2つのテーブルのジョインを作れば、スキーマ名とテーブル名を一緒に獲得することができます。From句の中の小文字のtとsは、テーブル名の別名(alias)というもので、Where句でのジョインの条件のところで項目名の修飾に利用されています。この修飾がないと、2つのテーブルに同じSCHEMAIDという名前の項目が存在しているわけですから、どの項目のことか分からなくなりますので、この修飾は必須です。テーブル名をそのまま項目名の修飾に使うこともできるのですが、エイリアスを使う方が簡単です。

SELECT SCHEMANAME, TABLENAME
  FROM SYS.SYSTABLES t, SYS.SYSSCHEMAS s
  WHERE t.SCHEMAID = s.SCHEMAID

 

 HTMLでプルダウン・メニューを作るには

 このSELECT文で得られた情報から、プルダウン・メニューを作ればいいのですが、念のため、HTMLのFORMでのプルダウン・メニューの作り方を復習しておきましょう。ちょうど、今回のサンプルの右側のメニューは、ContentsとAttributesという2つの固定した選択肢しか持っていませんので、これを見ておきましょう。HTMLで、次のようなコードになります。FORMのACTION部分には、このFORMから呼び出されるアクションを記述します。この例では、showtable.jspと名付けられた別のJSPを呼び出します。

<FORM METHOD="POST" ACTION="showtable.jsp">
  <select NAME="type">
    <option> Contents
    <option> Attributes
  </select>
  <INPUT TYPE="submit" VALUE="Show"><p>
</FORM>

 この例の、<option>以下の部分に、先のセレクト文で獲得されたテーブルの名前を置いていけばいいのです。

 

 テーブル一覧のメニューを作る

 これで、JSPでテーブル一覧のプルダウン・メニューを作る準備ができました。あとは、createStatement()executeQuery( query )といった、JDBCの基本的なメソッドを使って検索結果をResultSetとして獲得し、それから必要な項目を順番に抜き出していけばいいのです。今回は、あまり詳しく触れることはできませんが、ここで行われているのは、JDBCの処理としては定型的なものです。

<FORM METHOD="POST" ACTION="showtable.jsp">
  Table
  <select NAME="table">
<%
  try{
    stmt = conn.createStatement();
    String query = "Select SCHEMANAME, TABLENAME "
    + " from SYS.SYSTABLES t, SYS.SYSSCHEMAS s"
    + " where t.SCHEMAID = s.SCHEMAID " ;
    ResultSet rs = stmt.executeQuery( query ); // スキーマ名とテーブル名を
                           // システム・テーブルから検索する
    while( rs.next() ){
      String s0 = rs.getString( "SCHEMANAME");
      String s1 = rs.getString( "TABLENAME" );
      out.println("<option> " + s0 + "." + s1 ); // <option> の後ろに、
    } // スキーマ名とテーブル名を出力する
  }
  catch( SQLException e ){
    System.out.println( e );
  }
%>
  </select>
  

<select NAME="type">
    <option> Contents
    <option> Attributes
  </select>
  

<INPUT TYPE="submit" VALUE="Show"><p>
</FORM>

 こうしたJSPのコードは、最初には、HTMLとJavaのコードが入り交じった奇妙なものに思えるかもしれません。<%.....%>に囲まれた部分にJDBCのJavaコードが詰め込まれています。JSPでは、こうした部分を、「スクリプトレット(Scriptlet)」と呼んでいます。このScriptletは、先に見たように、システム・テーブルにアクセスしてデータベースの正式なテーブル名を獲得する働きをしているのですが、ページの表示に限っていえば、このScriptletがかかわるのはout.println()の部分だけです。具体的には、<option> テーブル名という文字列をページに複数出力することになります。この出力が、FORMでプルダウン・メニューの複数の選択肢を構成するHTMLのコードとして解釈されることになります。

 

 2つのページ間のパラメータの引き渡し

 このFORMには、2つのselect(SQLのSELECTとは違います)が含まれています。最初のtableという名前を持つselectで、option SYS.SYSTABLESが2つ目のtypeという名前を持つselectで、option Contentsが選択されて[Show]ボタンが押されたとしましょう。このとき、ACTIONで指定されたJSPページshowtable.jspに、次のようなScriptletがあれば、こうした選択情報を受け取ることができます。この場合には、tableという変数に文字列SYS.SYSTABLESが、typeという変数に文字列Contentsがセットされます。

<%
  table = request.getParameter("table");
  type = request.getParameter("type");
%>

 
1/3

J2EEの基礎(第5回)
テーブル・ブラウザを作る
  J2EEでのデータベースとの接続
  テーブル・ブラウザをインストールし実行する



連載内容
J2EEの基礎
  第1回 Java Pet Storeで、J2EEを体験する(1)
  第2回 Java Pet Storeで、J2EEを体験する(2)
 

第3回 J2EEアプリケーションと配置(deployment)

  第4回 J2EEアプリケーションを構成するコンポーネント
第5回 データベースのブラウザを作る
  第6回 EJBにおけるコンテナとコンポーネント
  第7回 J2EEのセキュリティのキホンを知る
  第8回 J2EEのトランザクション処理


連載記事一覧




Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間