連載
» 2004年11月17日 10時00分 公開

JavaTips 〜Javaプログラミング編:DbUtilsで結果セットの内容をスカラー値として取得する

[BULL,@IT]

 本Tipsは「DBUtilsで結果セットをJavaBeansにマッピングする」の続きです。DbUtilsの概要についてはそちらを参照してください。

 DbUtilsを使うと、検索結果をJavaBeansで取得するだけでなく、従来のResultSetのように結果セットから特定のカラムのデータを取得することもできます。これにはorg.apache.commons.dbutils.handlersパッケージのScalarHandler、ArrayHandler、ArrayListHandler、MapHandler、MapListHandlerを使います。これらの違いは以下のとおりです。ArrayHandlerはResultSet#getObject(int columnIndex)に、MapHandlerはResultSet#getObject(String colName)に対応することになります。

ScalarHandler、ArrayHandler、ArrayListHandler、MapHandler、MapListHandlerの違い
DbUtilsのクラス 機能 QueryRunner#query の戻り値の型
ScalarHandler 最初のレコードのデータからのn番目のカラムを取得する n番目のカラムに格納されている型
ArrayHandler 最初のレコードのデータをカラムごとにObject[]配列に格納し取得する Object[]
ArrayListHandler ArrayHandlerの全レコード対応版。全レコードについてArrayHandlerを適用し、得られた全Object[]インスタンスをListとして取得する List(個々の要素はObject[])
MapHandler 最初のレコードのデータをカラム名をキーとしてMapインスタンスに格納し取得する Map
MapListHandler MapHandlerの全レコード対応版。全レコードについてMapHandlerを適用し、得られた全MapインスタンスをListとして取得する List(個々の要素はMap)

DbUtilsで結果セットの特定のレコードを取得する

 Items.sqlで示されるようなテーブルITEMSに格納されたデータを、DbUtilsのScalarHandler、ArrayListHandler、MapListHandlerを用いて取得するjspの例を以下に示します。なお、DbUtilsのcommons-dbutils-1.0.jarがtomcat上のアプリケーションから参照可能になっており、DataSourceはJNDI名「java:comp/env/jdbc/TestDB」で取得できるものとします。tomcatでJNDI名を設定する方法は、「JNDI活用でデータソース管理を一元化する」を参照してください。

Items.sql
CREATE TABLE ITEMS
( ID INTEGER PRIMARY KEY,
  NAME VARCHAR(255) NOT NULL
);


ScalarArrayMapHandlerSample.jsp
<%@ page contentType="text/html; charset=Windows-31J"
    import="java.util.List,
            java.util.Iterator,
            java.util.Map,
            javax.naming.InitialContext,
            javax.sql.DataSource,
            javax.naming.Context,
            org.apache.commons.dbutils.QueryRunner,
            org.apache.commons.dbutils.handlers.MapListHandler,
            org.apache.commons.dbutils.handlers.ArrayListHandler,
            org.apache.commons.dbutils.handlers.ScalarHandler,
            org.apache.commons.dbutils.ResultSetHandler" %>
<%
  InitialContext init = new InitialContext();
  DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/TestDB");

  QueryRunner qr = new QueryRunner(ds);

  ResultSetHandler rsh1 = new ScalarHandler(1);//1カラム目を返すように指示
  Integer num = (Integer)qr.query("SELECT COUNT(*) FROM ITEMS", rsh1);

  // 1レコードのデータをカラム名をキーとして1つのMapインスタンスに格納し、全レコードについてそれらをまとめてListとして返すように指示
  ResultSetHandler rsh2 = new MapListHandler();
  List list1 = (List)qr.query("SELECT * FROM ITEMS", rsh2);

  //1レコードのデータを1つのObject[]配列に格納し、全レコードについてそれらをまとめてListとして返すように指示
  ResultSetHandler rsh3 = new ArrayListHandler();
  List list2 = (List)qr.query("SELECT * FROM ITEMS", rsh3);
%> 
<html>
<head><title>DbUtils ScalarArrayMapHandler sample</title></head>
<body>
ITEMSは全部で<%= num %>種類あります。

<table border="1">
<tr><th>ID</th><th>Name</th></tr>
<%
  for (Iterator i = list2.iterator(); i.hasNext(); ) {
    Object[] a = (Object[])i.next();
%> 
<tr><td><%= (Integer)a[0] %></td>
    <td><%= (String)a[1] %></td></tr>
<%
  }
%>
</table>

<table border="1">
<tr><th>ID</th><th>Name</th></tr>
<%
  for (Iterator i = list1.iterator(); i.hasNext(); ) {
    Map m = (Map)i.next();
%> 
<tr><td><%= m.get("ID") %></td>
    <td><%= m.get("Name") %></td></tr>
<%
  }
%> 
</table>

<%
  init.close(); 
%> 
</body>
</html> 


実行結果
実行結果

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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