0

我使用的数据库表经常变化,这意味着可以添加反映我的 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)));       
                }
            }

在这种方法中,我有两个问题(我注意到):

1)我需要执行两个循环

2)我不知道通过结果集使用哪个 get 函数,因为类型也可以改变。

我怎样才能克服这些问题?

我也很感激能得到一些其他的建议,也许有一个简单的原因

谢谢

4

1 回答 1

0

1)你有什么替代内循环的方法?您将如何获得字段值?你认为循环少量整数会有很多开销吗?
2) 您可以从获取字段名称的相同元数据中获取有关字段数据类型的额外信息,并相应地映射方法名称。
3) 你真的应该为多个表创建一个映射 - table/fieldSeq/fieldType/methodName 可能还有一些额外的细节 - 你不必一直动态地获取它们。

于 2012-08-29T21:24:22.107 回答