java.sql.ResultSet#getObject や Apache Jakarta Commons DbUtils の QueryRunner.query で取得する値の Java 型を調べるサンプルコード。値が null のときは型を調べられない。Java の null 値は型情報を持っていないのだろうか?


import java.sql.*;
import java.util.*;
import org.apache.commons.dbutils.*;
import org.apache.commons.dbutils.handlers.*;
 
/**
 * データベースのカラムに対する Java クラス型の情報を返します。
 */
public class CCM {
 
  public static void main(String[] args) throws Exception {
 
    String dbdriver = "com.mysql.jdbc.Driver";
    String dburl = "jdbc:mysql://localhost/hogedb";
    String dbuser = "hogeuser";
    String dbpass = "hogepassword";
    DBManager dbm = new DBManager(dbdriver, dburl, dbuser, dbpass);
    String sql = "select * from hogetable limit 1";
    testByJavaSql(dbm.createConnection(), sql);
    testByDbUtils(dbm.createConnection(), sql);
  }
 
  // java.sql パッケージを使う場合
  public static void testByJavaSql(Connection con, String sql)
    throws Exception {
 
    System.out.println("---------- testByJavaSql ----------");
    System.out.println("(sql=" + sql + ")");
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    Map ccm = getColumnClassMap(rs);
    for (Iterator it = ccm.keySet().iterator(); it.hasNext();) {
      print(ccm);
    }
    rs.close();
    stmt.close();
    con.close();
  }
 
  // Jakarta Commons DbUtils を使う場合
  public static void testByDbUtils(Connection con, String sql)
    throws Exception {
 
    System.out.println("---------- testByDbUtils ----------");
    System.out.println("(sql=" + sql + ")");
    QueryRunner qr = new QueryRunner();
    ResultSetHandler rsh = new MapListHandler(); // or using MapHandler
    List list = (List) qr.query(con, sql, rsh);
    for (int i = 0; i < list.size(); i++) {
      Map ccm = getColumnClassMap((Map) list.get(i));
      print(ccm);
    }
    DbUtils.close(con);
  }
 
  public static void print(Map columnClassMap){
    for (Iterator it = columnClassMap.keySet().iterator(); it.hasNext();) {
      String name = (String) it.next();
      Class cls = (Class) columnClassMap.get(name);
      // カラム名とクラスの型を出力
      System.out.println(name + "=" + cls);
    }
  }
 
  /**
   * カラムに対する Java クラス型の情報を返します。
   * @param record java.sql.ResultSet によるレコード情報
   * @return Mapオブジェクト(key=String[カラム名], value=Class[クラスの型])
   */
  public static Map getColumnClassMap(ResultSet record) throws Exception {
    Map result = new HashMap();
    ResultSetMetaData rsmd = record.getMetaData();
    int size = rsmd.getColumnCount();
    for (int i = 1; i <= size; i++) {
      String name = rsmd.getColumnName(i);
      String className = rsmd.getColumnClassName(i);
      if (className != null) {
        Class c = Class.forName(className);
        result.put(name, c);
      } else {
        // HashMap は null 値および null キーを使用可能
        result.put(name, null);
      }
    }
    return result;
  }
 
  /**
   * カラムに対する Java クラス型の情報を返します。
   * @param record Jakarta Commons DbUtils の返すレコード情報
   * @return Mapオブジェクト(key=String[カラム名], value=Class[クラスの型])
   */
  public static Map getColumnClassMap(Map record) {
    // using commons-dbutils-1.1.jar
    Map result = new HashMap();
    for (Iterator it = record.keySet().iterator(); it.hasNext();) {
      String name = (String) it.next(); // カラム名
      Object value = record.get(name);
      if (value != null) {
        Class c = value.getClass();
        result.put(name, c);
      } else {
        // HashMap は null 値および null キーを使用可能
        result.put(name, null);
      }
    }
    return result;
  }
 
  /**
   * DB管理クラス。
   */
  private static class DBManager {
 
    private final String dbdriver;
    private final String dburl;
    private final String dbuser;
    private final String dbpass;
 
    public DBManager(
      String dbdriver,
      String dburl,
      String dbuser,
      String dbpass) throws Exception {
 
      this.dbdriver = dbdriver;
      this.dburl = dburl;
      this.dbuser = dbuser;
      this.dbpass = dbpass;
 
      Class.forName(dbdriver);
    }
 
    public Connection createConnection() throws SQLException {
      Connection con = 
        DriverManager.getConnection(dburl, dbuser, dbpass);
      return con;
    }
  }
 
}

Ref. JDBC Utility Component - DbUtils

tags: zlashdot Java Java

Posted by NI-Lab. (@nilab)