0

私が使用している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関数を使用するかわかりません。

どうすればこれらの問題を克服できますか?

また、他の提案をいただければ幸いです。簡単な理由があるかもしれません。

ありがとう

4

1 に答える 1

0

1)内側のループに代わるものは何ですか?フィールド値をどのように取得しますか?少数の整数をループすることには多くのオーバーヘッドがあると思いますか?
2)フィールド名を取得し、それに応じてメソッド名をマップするのと同じメタデータから、フィールドデータ型に関する追加情報を取得できます。
3)実際には、複数のテーブル(table / fieldSeq / fieldType / methodNameと、場合によってはいくつかの追加の詳細)のマップを作成する必要があります。これらすべてを常に動的に取得する必要はありません。

于 2012-08-29T21:24:22.107 に答える