Java 使用resultSet值将HashMap映射到ArrayList

Java 使用resultSet值将HashMap映射到ArrayList,java,arraylist,hashmap,Java,Arraylist,Hashmap,我想查询sql语句并创建一个hashmap来存储2个值。一个是id,另一个是名称。然后我想把它添加到ArrayList中。我的代码有问题,与特定类型不匹配。我不明白它怎么了。你能解释一下我做错了什么吗?据我所知,您不能将类型为的hashmap添加到ArrayList,但我如何以其他方式实现它 ArrayList<String> KEYWORDS = new ArrayList<String>(); String sql = "SELECT da_tag_name, da

我想查询sql语句并创建一个hashmap来存储2个值。一个是id,另一个是名称。然后我想把它添加到ArrayList中。我的代码有问题,与特定类型不匹配。我不明白它怎么了。你能解释一下我做错了什么吗?据我所知,您不能将类型为
的hashmap添加到ArrayList,但我如何以其他方式实现它

ArrayList<String> KEYWORDS = new ArrayList<String>();

String sql = "SELECT da_tag_name, da_tag_id FROM da_tags WHERE da_tag_type_id = 8";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet resultSet = stmt.executeQuery();

while (resultSet.next()) {
    HashMap<String, String> row = new HashMap<String, String>();
    row.put(resultSet.getString(1).toString(), resultSet.getString(2).toString());
    KEYWORDS.add(row);
}
ArrayList关键字=新建ArrayList();
String sql=“从数据标记中选择数据标记名称、数据标记id,其中数据标记类型id=8”;
PreparedStatement stmt=conn.prepareStatement(sql);
ResultSet ResultSet=stmt.executeQuery();
while(resultSet.next()){
HashMap行=新建HashMap();
row.put(resultSet.getString(1.toString(),resultSet.getString(2.toString());
关键词.添加(行);
}

此代码存在一些问题

  • 列表的泛型类型与您试图添加的内容不匹配
  • 您应该养成对接口而不是实现进行编程的习惯
  • 变量应为camelCase(所有大写字母表示常量)
  • 大概是这样的:

    // Note: as of Java 7 you can simplify generics using the diamond operator   
    List<Map<String, String>> keywords= new ArrayList<>();
    
    String sql = "SELECT da_tag_name, da_tag_id FROM da_tags WHERE da_tag_type_id = 8";
    PreparedStatement stmt = conn.prepareStatement(sql);
    ResultSet resultSet = stmt.executeQuery();
    
    while (resultSet.next()) {    
        Map<String, String> row = new HashMap<>();
        row.put(resultSet.getString(1).toString(), resultSet.getString(2).toString());    
        keywords.add(row);    
    }
    
    //注意:从Java 7开始,您可以使用菱形运算符简化泛型
    列表关键字=新建ArrayList();
    String sql=“从数据标记中选择数据标记名称、数据标记id,其中数据标记类型id=8”;
    PreparedStatement stmt=conn.prepareStatement(sql);
    ResultSet ResultSet=stmt.executeQuery();
    while(resultSet.next()){
    Map row=newhashmap();
    row.put(resultSet.getString(1.toString(),resultSet.getString(2.toString());
    关键词.添加(行);
    }
    

    最后,我会考虑这个设计,并质疑使用一个只有一个条目的哈希表。

    这个代码有一些问题。

  • 列表的泛型类型与您试图添加的内容不匹配
  • 您应该养成对接口而不是实现进行编程的习惯
  • 变量应为camelCase(所有大写字母表示常量)
  • 大概是这样的:

    // Note: as of Java 7 you can simplify generics using the diamond operator   
    List<Map<String, String>> keywords= new ArrayList<>();
    
    String sql = "SELECT da_tag_name, da_tag_id FROM da_tags WHERE da_tag_type_id = 8";
    PreparedStatement stmt = conn.prepareStatement(sql);
    ResultSet resultSet = stmt.executeQuery();
    
    while (resultSet.next()) {    
        Map<String, String> row = new HashMap<>();
        row.put(resultSet.getString(1).toString(), resultSet.getString(2).toString());    
        keywords.add(row);    
    }
    
    //注意:从Java 7开始,您可以使用菱形运算符简化泛型
    列表关键字=新建ArrayList();
    String sql=“从数据标记中选择数据标记名称、数据标记id,其中数据标记类型id=8”;
    PreparedStatement stmt=conn.prepareStatement(sql);
    ResultSet ResultSet=stmt.executeQuery();
    while(resultSet.next()){
    Map row=newhashmap();
    row.put(resultSet.getString(1.toString(),resultSet.getString(2.toString());
    关键词.添加(行);
    }
    

    最后,我会考虑这个设计,并质疑使用一个只有一个条目的哈希图。

    你最好做的是创建一个表示你的数据库关键字对象的自定义类。例如:

    class Keyword {
    
             private final long id;
             private final String name;
    
             public Keyword(long id, String name) {
                  this.id = id;
                  this.name = name;
             }
    
             public long getId() {
                  return this.id;
             }
    
             public String getName() {
                  return this.name;
             }
        }  
    
    另外,最好使用接口列表而不是ArrayList。然后是这样的:

    List<Keyword> keywords = new ArrayList<>();
    

    您可以做的最好的事情是创建一个表示数据库关键字对象的自定义类。例如:

    class Keyword {
    
             private final long id;
             private final String name;
    
             public Keyword(long id, String name) {
                  this.id = id;
                  this.name = name;
             }
    
             public long getId() {
                  return this.id;
             }
    
             public String getName() {
                  return this.name;
             }
        }  
    
    另外,最好使用接口列表而不是ArrayList。然后是这样的:

    List<Keyword> keywords = new ArrayList<>();
    
    你需要改变

    ArrayList<String> keyword = new ArrayList<String>();
    
    你需要改变

    ArrayList<String> keyword = new ArrayList<String>();
    

    关键字
    应该是
    ArrayList
    您可以向ArrayList添加任何内容。因此HashMap是可能的。我不会将映射添加到列表中,而是创建一个同时具有两个字符串的自定义对象,例如
    类关键字{private String id;private String name;..}
    ,然后用一个
    列表来代替它。为什么不用一个
    链接的HashMap
    来代替这个奇怪的
    HashMap
    s的
    数组列表呢?另外:
    resultSet.getString(1)。toString()
    可以简化为
    resultSet.getString(1)
    。它已经是一个字符串,无需将其转换为原来的字符串。
    关键字
    应该是
    ArrayList
    您可以向ArrayList添加任何内容。因此HashMap是可能的。我不会将映射添加到列表中,而是创建一个同时具有两个字符串的自定义对象,例如
    类关键字{private String id;private String name;..}
    ,然后用一个
    列表来代替它。为什么不用一个
    链接的HashMap
    来代替这个奇怪的
    HashMap
    s的
    数组列表呢?另外:
    resultSet.getString(1)。toString()
    可以简化为
    resultSet.getString(1)
    。它已经是一个字符串,不需要将它转换为它已经是的样子。