如何在Java程序中将列名转换为变量?

时间:2011-08-15 17:24:19

标签: java reflection

假设您有来自表的数千行数据

    Index      | First_name       |    Last_name 
=====================================================
    1          |  John            |     Doe
    2          |  Jane            |     Doe

任务是在某个bean中表示此表的每一行。例如,拥有

会很高兴
private int index;
private String firstName
private String lastName

不幸的是列数和列名数未知,并且在收集数据之前无法创建bean

因此我无法对变量名称进行硬编码以期望firstName。我不知道我需要多少变量以及这些变量的类型。

有没有办法可以将表中的行表示为bean的一部分,其中变量名与列名相同?

这里的想法是,我最终必须比较这些bean的'n'并且想要智能地报告差异

我想我可以

Set<String> columnNames
List<Object> columnData

然后按索引匹配,但有更清洁的方法吗?

4 个答案:

答案 0 :(得分:3)

我认为表示数据的更好方法是每行一个Map<String, Object>,而不是你必须首先创建的自定义Bean类......之后你不能真正使用它,不知道它有哪些属性(例如获取/设置对)。

反射不能创建类(或接口),尽管您可以使用一些字节码操作库,或生成Java源代码并将其传递给编译器。 (但是,你之后如何使用该课程?仍然只能用反思。)

答案 1 :(得分:1)

如果您使用的是JDBC,则可以使用ResultSet.getMetaData()获取有关结果集中返回的列的详细信息,名称及其类型。

答案 2 :(得分:0)

好吧,理论上你可以使用字节码操作库(比如BCEL:http://bcel.sourceforge.net/)来动态创建类,然后将它们加载到你的JVM中。

然而,这不太值得。也许你应该问问自己为什么数据库列必须是Java类中的字段。你打算用它们做什么?

答案 3 :(得分:0)

这应该让你开始阅读列名和类型(假设连接是java.sql.Connection):

    DatabaseMetaData metadata = connection.getMetaData();
    ResultSet rsColumns = metadata.getColumns(null, null, "tablename", null);
    while (rsColumns.next()) 
    {
      String columnName = rsColumns.getString("COLUMN_NAME");
      String columnType = rsColumns.getString("TYPE_NAME");

      // Do your magic

    }