テーブルの構成情報を取得する−DatabaseMetaDataインターフェイス−
前述したResultSetMetaDataインターフェイスは結果セットの構成情報を管理するクラスでしたが、DatabaseMetaDataインターフェイスはデータベースの構成情報を管理します。データベースで利用可能なストアドプロシージャやテーブル、ユーザー名の一覧、製品そのもののバージョン番号、列名の最大文字数のような制約条件など、データベース全般に関する情報を取得するための手段を提供します。
ここでは、このDatabaseMetaDataインターフェイスを利用して、接続先のデータベース上に存在するテーブルのレイアウト表をリスト表示してみることにしましょう。
<%@ page contentType="text/html; charset=Shift_JIS" import="java.sql.*" %>
<dl>
<%
Class.forName("org.gjt.mm.mysql.Driver");
Connection db=DriverManager.getConnection("jdbc:mysql://localhost/sample?user
=root&password=root&useUnicode=true&characterEncoding=Shift_JIS");
db.setReadOnly(true);
DatabaseMetaData objMet=db.getMetaData();
ResultSet rs=objMet.getTables("sample","%","%",null);
while(rs.next()){
String strTbl=rs.getString("TABLE_NAME");
%>
<dt style="font-weight:bold"><%=strTbl%></dt>
<table border="1">
<tr>
<th>フィールド名</th><th>データ型</th><th>けた数</th>
</tr>
<% ResultSet rs2=objMet.getColumns("sample",null,strTbl,"%");
while(rs2.next()){ %>
<tr>
<td><%=rs2.getString("COLUMN_NAME")%></td>
<td><%=rs2.getString("TYPE_NAME")%></td>
<td align="right"><%=rs2.getString("CHAR_OCTET_LENGTH")%></td>
</tr>
<% } %>
</table>
<hr />
<%
}
db.close();
%>
</dl>
上記のコードの実行結果は以下のようになります。
ロジックの概要
DatabaseMetaDataオブジェクトを生成するのは、Connection#getMetaDataメソッドの役割です。これによって、現在の接続先データソースに対する構成情報が取得されます。
DatabaseMetaData#getTablesメソッドは、指定されたデータベースから利用可能なテーブルの一覧情報を返します。第1引数からそれぞれデータベース名、スキーマ名、テーブル名、テーブルの型を指定します(スキーマ名、テーブル名には「%(0文字以上の任意の文字)」のようなワイルドカードを指定することも可能です)。
getTablesメソッドの戻り値型はResultSetで、テーブルに関する情報(カタログ名、スキーマ名、テーブル名、テーブル型など)を含みます。もともとあるテーブルから結果セットを取り出すのと異なり、少々違和感があるかもしれませんが、仮想的に生成されたメモリ上のテーブルという意味ではなんらこれまでと変わりません。あらかじめgetTablesメソッドによって規定されたフィールド名(TABLE_NAMEなど)を介して、各値にアクセスすることが可能です(戻り値に含まれる結果セットのフィールド名について詳細は、Java APIリファレンスを参照してください)。
ここではgetTablesメソッドを介して取得したテーブル名をキーとして、さらにgetColumnsメソッドをコールしています。getColumnsメソッドは、指定されたテーブルに含まれるフィールドに関する情報を返します。第1引数からそれぞれカタログ名、スキーマ名、テーブル名、フィールド名を指定します(フィールド名にのみワイルドカードを指定することが可能です)。得られた結果セットからフィールド名やデータ型などの情報を取得していく手順は、getTablesメソッドの場合と同様です。
One Point
DatabaseMetaDataインターフェイスは、データベースの構成情報を管理します。DatabaseMetaDataインターフェイスを介することで、データベース上のオブジェクトに関する情報やそのほか属性情報についてアクセスすることが可能になります。
Copyright © ITmedia, Inc. All Rights Reserved.
