从java.sql.ResultSet生成具有列名和列值的映射

从java.sql.ResultSet生成具有列名和列值的映射,java,jdbc,Java,Jdbc,我有以下片段: Connection connection = getConnection(schemaName); Statement stmt = connection.createStatement(); String sql = "SELECT * FROM " + tableName; ResultSet rs = stmt.executeQuery(sql); 现在我想要实现的是建立一个 Map<String , List<String&

我有以下片段:

    Connection connection = getConnection(schemaName);
    Statement stmt = connection.createStatement();
    String sql = "SELECT * FROM " + tableName;
    ResultSet rs = stmt.executeQuery(sql);
现在我想要实现的是建立一个

Map<String , List<String>>
Map
其中key是columnName,value是columnValue的列表。这是我的密码:

    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();

    List<String> columnNames = new LinkedList<>();
    for (int i = 1; i <= columnCount; i++) {
        columnNames.add(rsmd.getColumnName(i));
    }

    Map<String, List<String>> columnNameToValuesMap = new HashMap<String, List<String>>();

    for (String columnName : columnNames) {
        List<String> values = new ArrayList<>();
        try {
            while (rs.next()) {
                values.add(rs.getString(columnName));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        columnNameToValuesMap.put(columnName, values);
    }
ResultSetMetaData rsmd=rs.getMetaData();
int columnCount=rsmd.getColumnCount();
List columnNames=新建LinkedList();

对于(int i=1;i,您可以按照以下步骤操作:

(1) 使用空的
列表
初始化列名称到值映射
,列名称作为键

(2) 使用
rs.next()

(3) 使用
for
循环获取每列数据,并添加到
列表
对象

(4) 将列数据的
列表添加到
columnNameToValuesMap
对象

您可以参考下面的代码和注释:

List<String> columnNames = new LinkedList<>();
Map<String,List<String>> columnNameToValuesMap=new HashMap<String, List<String>>();

 for (int i = 1; i <= columnCount; i++) {
        String columnName = rsmd.getColumnName(i);
        columnNames.add(columnName);

        //Load the Map initially with keys(columnnames) and empty list
        columnNameToValuesMap.put(columnName, new ArrayList());
 }

 try {
    while (rs.next()) { //Iterate the resultset for each row

      for (String columnName : columnNames) {
         //Get the list mapped to column name
         List<String> columnDataList = columnNameToValuesMap.get(columnName);

          //Add the current row's column data to list
          columnDataList.add(rs.getString(columnName));

          //add the updated list of column data to the map now
          columnNameToValuesMap.put(columnName, columnDataList);
        }
     }
 } catch (SQLException e) {
    e.printStackTrace();
}
List columnNames=newlinkedlist();
Map columnNameToValuesMap=新HashMap();

对于(int i=1;我将您放入columnNames循环之外的映射中..columnName超出了范围。现在更新了代码,您可以查看一下,基本上您需要多个列表对象,每个对象都映射到列名。为什么要这样做?看起来您重新创建并行数组并没有特别好的理由。与您的问题无关,但应该使用
getColumnLabel
而不是
getColumnName