java DB元数据更改如何创建动态sql?
我使用的数据库表经常变化,这意味着可以添加新的列,以反映我的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)我不知道通过resultset使用哪个get函数,因为类型也可以更改
我怎样才能克服这些问题
我也希望得到一些其他建议,也许有一个简单的原因
谢谢
# 1 楼答案
1)除了内环,你还有什么选择?如何获取字段值?你认为在少量整数上循环会有很多开销吗
2) 您可以从相同的元数据中获取关于字段数据类型的额外信息,在元数据中获取字段名并相应地映射方法名
3) 你真的应该为多个表创建一个映射——table/fieldSeq/fieldType/methodName,也许还有一些额外的细节——你不必一直动态地获取它们