連載
» 2004年02月26日 00時00分 公開

クラスライブラリを攻略「データベース編」基礎から学ぶサーブレット/JSP(10)(3/5 ページ)

[山田祥寛,@IT]

MS-Accessで作成したクエリをJSPから実行する−CallableStatementインターフェイス−

 多くのデータベースには、「ストアドプロシージャ」と呼ばれる一連のSQL手続きを表すことができるオブジェクトが用意されています。複雑なSQL命令をデータベースに発行するような場合には、アプリケーション側から動的に命令を送信するのではなく、このストアドプロシージャを利用することで、処理効率を向上させることができます。

 すなわち、1つに、ストアドプロシージャを利用することで、アプリケーションサーバとデータベースサーバとがリモートの関係にある場合には、サーバ間を行き来するトラフィックを軽減することができます。そしてもう1つに、ストアドプロシージャはデータベース上であらかじめ解析・コンパイル処理された状態で格納(stored)されているので、実行に先立つ処理上のオーバヘッドを軽減することができます。

 MySQLの現バージョン(4.0.x)ではストアドプロシージャは実装されていませんので(5.xでは実装予定)、ここではMicrosoft Accessの該当する機能――クエリを利用して、CallableStatementインターフェイスの例を示してみることにします。

<%@ page contentType="text/html; charset=Shift_JIS" import="java.sql.*" %>
<table border="1">
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection db=DriverManager.getConnection("jdbc:odbc:sample","","");
CallableStatement objSql=db.prepareCall("{call selectBooks (?)}");
objSql.setString(1,"@IT");
ResultSet rs=objSql.executeQuery();
ResultSetMetaData objMet=rs.getMetaData();
out.print("<tr>");
for(int i=1;i<=objMet.getColumnCount();i++){
  out.print("<th>" + objMet.getColumnName(i) + "</th>");
}
out.print("</tr>");
while(rs.next()){
  out.print("<tr>");
  for(int j=1;j<=objMet.getColumnCount();j++){
    out.print("<td>" + rs.getString(j) + "</td>");
  }
  out.write("</tr>");
}
objSql.close();
db.close();
%>
</table>
stored.jsp

 上記のコードの実行結果は以下になります。

実行結果 実行結果
Accessクエリのデザイン内容 Accessクエリのデザイン内容

ロジックの概要

 CallableStatementインターフェイスによるデータベース発行もまた、ほとんど前述のStatement/PreparedStatementインターフェイスと変わるところはありません。ただ一点注意していただきたいのは、呼び出しの構文の個所です。

{call selectBooks (?)} 

 ストアドプロシージャ(クエリ)をコールする場合には、「{call ストアドプロシージャ名 (パラメータ,...)}」のように記述する必要があります。パラメータを表すプレイスホルダ(「?」)はストアドプロシージャ上で定義されたパラメータの数だけ、カンマ区切りで指定することができます。

結果セットの構成情報を取得する

 ここでは、もう1つ注目すべき点として、ResultSetMetaDataインターフェイスを利用している点が挙げられます。ResultSetMetaDataはその名のとおり、結果セットの構成情報を管理するためのインターフェイスで、結果セットに含まれるフィールド数や、フィールド名、データ型、けた数などの情報を取得する手段を提供します。

 Statementインターフェイスでの例のように、アプリケーションコード中にフィールド名をハードコーディングするのももちろん可能ですが、より汎用的なデータ表示のプログラムを作成したいといった場合、それでは用をなしません。

 そこでResultSetMetaDataインターフェイスを介することで、現在の結果セットにおける列数やフィールド名を動的に取得しているわけです。列数さえ指定してしまえば、あとはforループによってフィールド名やフィールド値を取得することは可能です。

 Resultset#getXxxxxメソッドでは、引数としてフィールド名だけではなく、列インデックスを指定できる点にも注目してください。

One Point

CallableStatementインターフェイスは、データベース上にあらかじめ用意されたストアドプロシージャを実行する場合に用います。ストアドプロシージャは複雑なSQL命令を効率よく実行する場合に有効です。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。