私が使用しているdbテーブルは頻繁に変更されます。つまり、私のSQLを反映する新しい列を追加できます。
私が考えていた解決策は、最初にメタデータをマップに「読み取り」、それを使用して次のような値を取得することです。
メタデータの読み取り:
public class Dynamic {
static public final Map<Integer, String> metadata = initMetaData();
HashMap<String, String> data = new HashMap<String, String>();
private static Map<Integer, String> initMetaData() {
Map<Integer, String> tmpMap = new HashMap<Integer, String>();
try {
Connection connection = DBConnection.getConnection();
try {
Statement stmt = connection.createStatement();
ResultSet result = stmt.executeQuery("SELECT * FROM TMP WHERE ROWNUM = 1");
for (int i = 1; i <= result.getMetaData().getColumnCount(); i++) {
tmpMap.put(new Integer(i), result.getMetaData().getColumnName(i));
}
} finally {
connection.close();
}
} catch (SQLException ex) {
…..
}
return Collections.unmodifiableMap(tmpMap);
}
public static String getColumnName(Integer index) {
return metadata.get(index);
}
そしてSQLを実行するとき:
public static void test()
try {
Connection connection = DBConnection.getConnection()
try {
Statement stmt = connection.createStatement();
ResultSet result = stmt.executeQuery("SELECT * FROM TMP where idx = 'R5'");
while (result.next()) {
Dynamic d = new Dynamic()
for (int i = 1; i <= Dynamic.metadata.size(); i++) {
d.setData(Dynamic.getColumnName(i),result.getString(Dynamic.getColumnName(i)));
}
}
このアプローチでは、2つの問題があります(私は気づきました):
1)2つのループを実行する必要があります
2)タイプも変更される可能性があるため、resultsetを介してどのget関数を使用するかわかりません。
どうすればこれらの問題を克服できますか?
また、他の提案をいただければ幸いです。簡単な理由があるかもしれません。
ありがとう