Java 在多维HashMap中存储MySQL查询中的多行

Java 在多维HashMap中存储MySQL查询中的多行,java,mysql,hashmap,Java,Mysql,Hashmap,因此,我尝试将MySQL查询结果集存储到多维HashMap中,如下所示: public HashMap<String, HashMap<String, String>> getData(String query) { Statement stmt = null; HashMap<String, HashMap<String, String>> results = new HashMap<String, HashMa

因此,我尝试将MySQL查询结果集存储到多维HashMap中,如下所示:

  public HashMap<String, HashMap<String, String>> getData(String query)
  {
     Statement stmt = null;
     HashMap<String, HashMap<String, String>> results = new HashMap<String, HashMap<String, String>>();

     try
     {
        stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(query);
        ResultSetMetaData rsmd = rs.getMetaData();

        while (rs.next())
        {
           for (int i = 1; i < rsmd.getColumnCount() + 1; i++)
           {
              results.put(Integer.toString(i - 1), new HashMap<String, String>());
              results.get(Integer.toString(i - 1)).put(rsmd.getColumnLabel(i), rs.getString(i));
           }
        }
     }
     catch (SQLException ex)
     {
        ex.printStackTrace(System.out);
     }

     return results;
  }
它只存储一行结果,我不知道为什么

0 = {Date=2014-11-04}
1 = {Num=1256}
2 = {ATime=null}
3 = {ALocCode=null}
4 = {DTime=1:00 PM}
5 = {DLocCode=JFK}
6 = {EstATime=8:00 PM}
7 = {EstDTime=1:00 PM}
8 = {EId=7624}
我的问题是,我唯一能说的是它与PHP有关,那就是我如何让它像这样存储

$result[0]['Date'] = '3214';
....
$result[1]['Date'] = '6426';

由于这正是我试图实现的目标?

交换“行”和“列”的主要问题,下一个问题是每次放置字段时都要创建HashMap,正确的代码如下所示:

public Map<String, Map<String, String>> getData(final String query) {
    final Map<String, Map<String, String>> results = new HashMap<>();

    try (final Statement stmt = this.conn.createStatement(); final ResultSet rs = stmt.executeQuery(query);) {
        final ResultSetMetaData rsmd = rs.getMetaData();
        long rId = 0;
        while (rs.next()) {
            final Map<String, String> record = new HashMap<>();
            for (int i = 1; i < (rsmd.getColumnCount() + 1); i++) {
                record.put(rsmd.getColumnLabel(i), rs.getString(i));
            }
            results.put(String.valueOf(rId++), record);
        }
    } catch (final SQLException ex) {
        ex.printStackTrace(System.out);
    }

    return results;
}

public static void printMap(final Map<?, ?> mp) {
    for (final Entry<?, ?> entry : mp.entrySet()) {
        final Object key = entry.getKey();
        final Object value = entry.getValue();
        if (value instanceof Map) {
            System.out.println(key);
            printMap((Map<?, ?>) value);
        } else {
            System.out.println(key + "=" + entry.getValue());
        }
    }
}
publicmap getData(最终字符串查询){
最终映射结果=新HashMap();
try(final Statement stmt=this.conn.createStatement();final ResultSet rs=stmt.executeQuery(查询);){
最终结果setMetadata rsmd=rs.getMetaData();
长rId=0;
while(rs.next()){
最终映射记录=新的HashMap();
对于(int i=1;i<(rsmd.getColumnCount()+1);i++){
record.put(rsmd.getColumnLabel(i)、rs.getString(i));
}
results.put(String.valueOf(rId++),record);
}
}捕获(最终SQLException ex){
例如printStackTrace(系统输出);
}
返回结果;
}
公共静态无效打印地图(最终地图mp){
for(最终条目:mp.entrySet()){
最终对象键=entry.getKey();
最终对象值=entry.getValue();
if(映射的值实例){
系统输出打印项次(键);
printMap((Map)值);
}否则{
System.out.println(key+“=”+entry.getValue());
}
}
}

交换“行”和“列”的主要问题,下一个问题是每次放置字段时都要创建HashMap,正确的代码如下所示:

public Map<String, Map<String, String>> getData(final String query) {
    final Map<String, Map<String, String>> results = new HashMap<>();

    try (final Statement stmt = this.conn.createStatement(); final ResultSet rs = stmt.executeQuery(query);) {
        final ResultSetMetaData rsmd = rs.getMetaData();
        long rId = 0;
        while (rs.next()) {
            final Map<String, String> record = new HashMap<>();
            for (int i = 1; i < (rsmd.getColumnCount() + 1); i++) {
                record.put(rsmd.getColumnLabel(i), rs.getString(i));
            }
            results.put(String.valueOf(rId++), record);
        }
    } catch (final SQLException ex) {
        ex.printStackTrace(System.out);
    }

    return results;
}

public static void printMap(final Map<?, ?> mp) {
    for (final Entry<?, ?> entry : mp.entrySet()) {
        final Object key = entry.getKey();
        final Object value = entry.getValue();
        if (value instanceof Map) {
            System.out.println(key);
            printMap((Map<?, ?>) value);
        } else {
            System.out.println(key + "=" + entry.getValue());
        }
    }
}
publicmap getData(最终字符串查询){
最终映射结果=新HashMap();
try(final Statement stmt=this.conn.createStatement();final ResultSet rs=stmt.executeQuery(查询);){
最终结果setMetadata rsmd=rs.getMetaData();
长rId=0;
while(rs.next()){
最终映射记录=新的HashMap();
对于(int i=1;i<(rsmd.getColumnCount()+1);i++){
record.put(rsmd.getColumnLabel(i)、rs.getString(i));
}
results.put(String.valueOf(rId++),record);
}
}捕获(最终SQLException ex){
例如printStackTrace(系统输出);
}
返回结果;
}
公共静态无效打印地图(最终地图mp){
for(最终条目:mp.entrySet()){
最终对象键=entry.getKey();
最终对象值=entry.getValue();
if(映射的值实例){
系统输出打印项次(键);
printMap((Map)值);
}否则{
System.out.println(key+“=”+entry.getValue());
}
}
}

拉桑的回答有助于解决您需要解决的错误,但可以改进:

  • 您需要对行而不是字符串进行数字访问(
    $result[0]['Date']
  • print
    方法应使用全类型参数
  • 行应存储在
    TreeMap
    LinkedHashMap
    ArrayList
    中以保留行顺序<实际上,code>ArrayList更适合您的情况
  • 列应存储在
    LinkedHashMap
    中以保留列顺序
  • 不要捕获异常并继续。允许它级联到调用方
更新版本:

public List<Map<String, String>> getData(final String query) throws SQLException {
    final List<Map<String, String>> results = new ArrayList<>();
    try (Statement stmt = this.conn.createStatement();
         ResultSet rs = stmt.executeQuery(query)) {
        ResultSetMetaData metaData = rs.getMetaData();
        while (rs.next()) {
            Map<String, String> record = new LinkedHashMap<>();
            for (int col = 1; col <= metaData.getColumnCount(); col++)
                record.put(metaData.getColumnLabel(col), rs.getString(col));
            results.add(record);
        }
    }
    return results;
}

public static void printMap(List<Map<String, String>> rows) {
    for (int rowNum = 0; rowNum < rows.size(); rowNum++)
        System.out.println(rowNum + " = " + rows.get(rowNum));
}
公共列表getData(最终字符串查询)引发SQLException{ 最终列表结果=新建ArrayList(); try(语句stmt=this.conn.createStatement(); 结果集rs=stmt.executeQuery(查询)){ ResultSetMetaData元数据=rs.getMetaData(); while(rs.next()){ 映射记录=新建LinkedHashMap();
对于(int col=1;col,Lashane的回答有助于解决您需要解决的错误,但可以改进:

  • 您需要对行而不是字符串进行数字访问(
    $result[0]['Date']
  • print
    方法应使用全类型参数
  • 行应该存储在
    TreeMap
    LinkedHashMap
    ArrayList
    中以保留行顺序。
    ArrayList
    实际上更适合您的情况
  • 列应存储在
    LinkedHashMap
    中以保留列顺序
  • 不要捕获异常并继续。允许它级联到调用方
更新版本:

public List<Map<String, String>> getData(final String query) throws SQLException {
    final List<Map<String, String>> results = new ArrayList<>();
    try (Statement stmt = this.conn.createStatement();
         ResultSet rs = stmt.executeQuery(query)) {
        ResultSetMetaData metaData = rs.getMetaData();
        while (rs.next()) {
            Map<String, String> record = new LinkedHashMap<>();
            for (int col = 1; col <= metaData.getColumnCount(); col++)
                record.put(metaData.getColumnLabel(col), rs.getString(col));
            results.add(record);
        }
    }
    return results;
}

public static void printMap(List<Map<String, String>> rows) {
    for (int rowNum = 0; rowNum < rows.size(); rowNum++)
        System.out.println(rowNum + " = " + rows.get(rowNum));
}
公共列表getData(最终字符串查询)引发SQLException{ 最终列表结果=新建ArrayList(); try(语句stmt=this.conn.createStatement(); 结果集rs=stmt.executeQuery(查询)){ ResultSetMetaData元数据=rs.getMetaData(); while(rs.next()){ 映射记录=新建LinkedHashMap();
对于(int col=1;col为什么使用Map而不是HashMap?最终条目也不会编译,将其更改为最终映射。条目修复了它:D@EllisonPatterson使用
Entry
unqualified将在导入时起作用。@EllisonPatterson在变量中使用
Map
而不是
HashMap
的原因是,您可以轻松地更改到另一个映射,e、 g.
TreeMap
如果您想按名称对列进行排序,或者
LinkedHashMap
如果您想保留查询的列顺序。啊,明白了!谢谢,现在我只需要将其分离出来,因为您打印的方式比我想象的更复杂!为什么要用Map而不是HashMap?最终条目也不会编译,将其更改为最终的Map。条目修复es it:D@EllisonPatterson使用
Entry
unqualified将在导入时起作用。@EllisonPatterson在变量中使用
Map
而不是
HashMap
的原因是,您可以轻松地更改到另一个映射,例如,如果您希望按名称排序列,则使用
TreeMap
,如果您想保留列顺序