【问题标题】:Java ResultSet copy to generic object or listJava ResultSet 复制到通用对象或列表
【发布时间】:2014-05-24 01:25:45
【问题描述】:

我知道使用 ResultSet 的问题,并且已经看到有关将数据提取到对象(或列表)中的示例,但是,我希望以通用方式执行此操作,即无需了解类.

有没有办法做到这一点,结果是一个对象或列表,然后我可以使用反射进行迭代?

我研究过的似乎不起作用或需要目标类的类意识的解决方案包括:

我也尝试过 ResultSetMapper (http://resultsetmapper.sourceforge.net/),它似乎也需要这个类。我真的只是想要一个我可以采取行动的对象或列表。

【问题讨论】:

标签: java jdbc resultset


【解决方案1】:

这很笼统:

Statement st = con.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM Clients WHERE ID <= 2");

// collect column names
List<String> columnNames = new ArrayList<>();
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
    columnNames.add(rsmd.getColumnLabel(i));
}

int rowIndex = 0;
while (rs.next()) {
    rowIndex++;
    // collect row data as objects in a List
    List<Object> rowData = new ArrayList<>();
    for (int i = 1; i <= rsmd.getColumnCount(); i++) {
        rowData.add(rs.getObject(i));
    }
    // for test purposes, dump contents to check our results
    // (the real code would pass the "rowData" List to some other routine)
    System.out.printf("Row %d%n", rowIndex);
    for (int colIndex = 0; colIndex < rsmd.getColumnCount(); colIndex++) {
        String objType = "null";
        String objString = "";
        Object columnObject = rowData.get(colIndex);
        if (columnObject != null) {
            objString = columnObject.toString() + " ";
            objType = columnObject.getClass().getName();
        }
        System.out.printf("  %s: %s(%s)%n",
                columnNames.get(colIndex), objString, objType);
    }
}

对于我的测试数据(在 SQL Server 中),它将以下内容打印到控制台:

Row 1
  ID: 1 (java.lang.Integer)
  LastName: Thompson (java.lang.String)
  FirstName: Gord (java.lang.String)
  DOB: (null)
Row 2
  ID: 2 (java.lang.Integer)
  LastName: Loblaw (java.lang.String)
  FirstName: Bob (java.lang.String)
  DOB: 1966-09-12 16:03:00.0 (java.sql.Timestamp)

【讨论】:

  • 感谢您提供此 Gord - 我一定会试一试。我有点受限,因为我需要一个 List 来传递给我无法控制的另一个函数。您知道产生 List 或干净地转换 Maps 的解决方案吗?
  • 使用 List 代替 Map>
  • @haxor 我已经更新了我的答案以使用List&lt;Object&gt;
  • 嗨,戈德 - 谢谢。在您的示例中,每一行是单独的对象还是单独的 List?我会假设每一行都是一个对象,但这不是我从你的代码输出中得到的。尽管如此,这确实非常有帮助(标记为答案)。您的代码是否易于修改以使每一行都是一个 Object 和一个 List 包含所有这些?
  • @haxor re:“您的代码是否易于修改,以使每一行都成为一个 Object 和一个 List 包含所有这些?” - 好吧,ArrayList 对象本身就是Object,因此您可以想象将每个rowData 对象添加到另一个名为tblData 的ArrayList 中。然后,根据您希望术语的精确程度,您可以说每一行是一个Object(一个ArrayList 对象),而行“对象”(名为tblData)的List 是一个@987654332 @.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多