ジェネリックス+リフレクションによる実装
// 異なるテーブルに対するジェネリッククエリ:オブジェクトを返す(バージョン1.0)
public <T> T getInstance(Class<T> clazz, String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 1.データベース接続を取得する
conn = JDBCUtils.getConnection();
// 2.PreparedStatementオブジェクトを取得するためにSQL文をプリコンパイルする
ps = conn.prepareStatement(sql);
// 3.プレースホルダを埋める
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
// 4.executeQuery()を実行し、結果セットを取得する: ResultSet
rs = ps.executeQuery();
// 5.結果セットのメタデータを取得する: ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
// 6.1ResultSetMetaDataでcolumnCount,columnLabelを取得する。
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
T t = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {// 各列を繰り返し処理する
// 列の値を取得する
Object columnVal = rs.getObject(i + 1);
// カラムのエイリアスを取得する:カラムのエイリアスを使用し、クラスのプロパティ名を
String columnLabel = rsmd.getColumnLabel(i + 1);
// 6.2リフレクションを使用して、オブジェクトの対応するプロパティに値を割り当てる
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnVal);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7.リソースを閉じる
JDBCUtils.closeResource(conn, ps, rs);
}
return null;
}