如何从返回函数保存ArrayList <HashMap <String,String >>?

时间:2019-08-20 06:30:26

标签: java jdbc

我对操纵ArrayList<HashMap<String, String>>不太熟悉。在这个问题中,我想保存一个函数的返回ArrayList<HashMap<String, String>>。但是,如果编码错误,我不知道天气。谁能帮我吗?

我已经检查了我的sql代码,它可以正常工作并返回我想要的东西。

List<HashMap<String, String>> ErrorList= new ArrayList<HashMap<String, String>>();
ErrorList = select("SELECT * FROM process_result WHERE (status = 'Error') AND (mailBefore = 'No');");
public List<HashMap<String, String>> select(String query) {
        List<HashMap<String, String>> output = new ArrayList<HashMap<String, String>>();

        HashMap<String, String> map = null;
        Statement statement = null;
        try {
            statement = this.conn.createStatement();
            ResultSet rs = statement.executeQuery(StringEscapeUtils.unescapeJava(query));

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

            map = new HashMap<String, String>();

            while (rs.next()) {
                for (int i = 1; i <= columnCount; i++ ) {
                    map.put(rsmd.getColumnName(i), rs.getString(i));
                }
                output.add(map);
            }

        } catch (SQLException e) {
            logger.error(e);
            e.printStackTrace();
        }
        //System.out.print("This is select output:" + output);
        return output;
    }

代码没有正确保存选择函数的返回值。

1 个答案:

答案 0 :(得分:1)

您将始终用相同的列名和数据覆盖同一map实例中每一行的map键,因此最终将获得来自最后一行的数据。 ResultSetmap列表中的output只有一个条目

相反,为HashMap中的每一行创建一个新的ResultSet实例,并将map添加到每一行的列表中:

while (rs.next()) {
   map = new HashMap<>(); //create one new map for every row
   for (int i = 1; i <= columnCount; i++ ) {
        map.put(rsmd.getColumnName(i), rs.getString(i));
   }
   output.add(map);
}

我还建议将方法的签名更改为:

public List<Map<String, String>> select(String query)

因此,请勿将代码耦合到实现。

您还需要更改这些行:

List<Map<String, String>> output = new ArrayList<Map<String, String>>();
// do not have a dependency on a particular implementation of the Map API
Map<String, String> map = null;