Java DB元数据更改-如何创建动态sql?

Java DB元数据更改-如何创建动态sql?,java,Java,我使用的db表经常变化,这意味着可以添加新的列,以反映我的sql 我所想的解决方案是首先将元数据“读取”到某个映射中,然后使用它来检索类似这样的值 读取元数据: public class Dynamic { static public final Map<Integer, String> metadata = initMetaData(); HashMap<String, String> data = new HashMap<String, String>()

我使用的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);
}
公共类动态{
静态公共最终映射元数据=initMetaData();
HashMap数据=新的HashMap();
私有静态映射initMetaData(){
Map tmpMap=newhashmap();
试一试{
Connection=DBConnection.getConnection();
试一试{
语句stmt=connection.createStatement();
ResultSet result=stmt.executeQuery(“从TMP中选择*,其中ROWNUM=1”);
对于(int i=1;i1)内部循环的替代方案是什么?如何获得字段值?您认为在少量整数上循环会有很多开销吗?
2) 您可以从相同的元数据中获取有关字段数据类型的额外信息,在该元数据中可以获取字段名并相应地映射方法名。

3) 你真的应该为多个表创建一个映射-table/fieldSeq/fieldType/methodName,也许还有一些额外的细节-你不必一直动态地获取它们。

你说的“多表映射”是什么意思您可以更具体一些,或者添加一些示例您可以像这样构建表结构查询:
…stmt.executeQuery(“从“+tableName”中选择TOP 1*);
并将数据映射hashmap定义为
Map dataStructureMap=…
或者您可以更进一步,将其他字段详细信息存储在更复杂的结构中,如
Map dataStructureMap=…
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)));       
                }
            }