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;
}
}
}
tags: zlashdot Java Java
Posted by NI-Lab. (@nilab)