オリジナルの RowProcessor を作成方法は次の通りです。
デフォルトで使用される BasicRowProcessor は Bean とテーブル列をマッピングするときに列名で比較します。
これを列名ではなく、ラベル名で比較するように変更したクラス LabelRowProcesser を作ってみました。
BasicRowProcessor のクラス名を変えて、ロジックを 2 行変更しただけです。
具体的には ResultSetMetaData から列名を取得している箇所をラベル名を取得するように呼び出しメソッドを変更しました。
getColumnName メソッド → getColumnLabel メソッド
オリジナルの RowProcessor を使った場合のコードは次のようになります。
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.List;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
/**
* DBUtilsを使ったサンプル。
* 独自のRowProcessorを使ってみる。
*/
public class Sample3 {
public static void main(String[] args) throws Exception{
Class.forName("org.hsqldb.jdbcDriver");
Connection con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost","sa","");
ResultSetHandler h = new BeanListHandler(Product.class, LabelRowProcessor.instance());
QueryRunner runner = new QueryRunner();
String sql = "SELECT ID NAME, NAME ID, PRICE FROM PRODUCT";
List list = (List) runner.query(con, sql, h);
for(int i=0; i<list.size(); i++){
Product p = (Product) list.get(i);
System.out.println("id:" + p.getId());
System.out.println("name:" + p.getName());
System.out.println("price:" + p.getPrice());
}
DbUtils.closeQuietly(con);
}
}
デフォルトの BasicRowProcessor を使うときとの違いは1つだけです。
それは、
ResultSetHandler h = new BeanListHandler(Product.class, LabelRowProcessor.instance());
標準で用意されている Handler には RowProcessor を引数にとるコンストラクタがあるのでそれを使って使用する RowProcessor を指定します。
今回の使ったのは:
Jakarta Commons DBUtils API 1.0
◎参考
Java殴り書き
「Jakarta Commons DBUtils part1」
・・・BeanHandler を使ったサンプルの説明をしています。
「Jakarta Commons DBUtils part2」
・・・BeanListHandler を使ったサンプルの説明をしています。