假设您有来自表的数千行数据
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
然后按索引匹配,但有更清洁的方法吗?
答案 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
}