我知道使用ResultSet的问题,并且看到了有关将数据提取到对象(或列表)中的示例,但是,我想以一种通用的方式来执行此操作,即不必知道类。

有没有一种方法可以使结果成为对象或列表,然后可以使用反射进行迭代?

我检查过的解决方案似乎不起作用或需要对目标班级有阶级意识的解决方案包括:


How to copy resultset into object?
Copying Java ResultSet


我也尝试了ResultSetMapper(http://resultsetmapper.sourceforge.net/),它似乎也需要该类。我真的只是想要一个可以作用的对象或列表。

最佳答案

这是非常通用的:

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)

关于java - Java ResultSet复制到通用对象或列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23840410/

10-11 07:36