循环遍历数据库 ResultSet

Posted

技术标签:

【中文标题】循环遍历数据库 ResultSet【英文标题】:Looping through database ResultSet 【发布时间】:2013-11-09 13:23:01 【问题描述】:

我在这里有一个 Java 代码的 sn-p,它应该从数据库查询中检索结果,并且 ResultSet 应该遍历这些值,以便为 ResultSet 的每个条目检索某些 API 数据。 但是,问题是我只能检索 ResultSet 的第一个条目的 API 数据。

此代码完全按预期工作并返回我的所有数据库条目。

try 
    ResultSet rs;
    rs = stat.executeQuery("select * from schedule");
    while (rs.next()) 
        model.addRow(new Object[]rs.getString("SHOW"), rs.getString("SEASON"));
    
 catch (Exception e) 
    console.append(e.getMessage() + '\n');

但是,此代码仅返回第一个条目。

try 
    ResultSet rs = stat.executeQuery("select * from schedule");
    while (rs.next()) 
        String show = rs.getString("SHOW");
        String season = rs.getString("SEASON");
        String api_url = "<API_URL>/" + show + "/" + season;

     URL url = new URL(api_url);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.setRequestProperty("User-Agent", USER_AGENT);
        int responseCode = con.getResponseCode();
        if (responseCode == 200) 
            conn_stat.setText("Connection Status : OK");
         else 
            conn_stat.setText("Connection Status : ERR");
        
        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuilder response = new StringBuilder();
        while ((inputLine = in.readLine()) != null) 
            response.append(inputLine);
        
        in.close();
        String s = response.toString();
        JsonArray json = JsonArray.readFrom(s);
        for (int i = 0; i < json.size(); i++) 
            JsonObject show_json = json.get(i).asObject();
            int episode = show_json.get("episode").asInt();
            String date = show_json.get("first_aired_iso").asString();
            String title = show_json.get("title").asString();
            String date_formatted = date.substring(0, date.indexOf("T"));
            SimpleDateFormat original = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat target = new SimpleDateFormat("dd-MMM-yyyy");
            Date unformatteddate = original.parse(date_formatted);
            String dateStart = target.format(unformatteddate);
            Date curr_date = new Date();
            String dateStop = target.format(curr_date);
            Date d1 = null;
            Date d2 = null;
            d1 = target.parse(dateStart);
            d2 = target.parse(dateStop);
            long diff = d2.getTime() - d1.getTime();
            long diffDays = diff / (24 * 60 * 60 * 1000);
            if (diffDays < 0) 
               alert_model.addRow(new Object[]show + " - " + episode, title, dateStart);
            
        
    
 catch (Exception e) 
    console.append(e.getMessage() + '\n');

【问题讨论】:

如果在循环中添加日志,会打印多少条日志?只有一个?您是否在 /* DOING THINGS WITH RETRIEVED RESULT */ 的某个地方引用了 rs?还是您提供的代码全部存在?如果将String api_url ...下面的代码注释掉直到循环的右括号,是否会返回所有记录(使用记录器查看将返回多少条记录)? 获得特定条目的 API 结果后,将不再有对 ResultSet 的引用。之后,仅操作来自 API 的 JSON 响应。我正在检查使用记录器返回的记录。 @PrzemyslawKruglej 我尝试通过注释掉代码来检索所有数据。但并非如此。 要么显示使用代码,要么尝试逐行取消注释以检查哪一行导致结果集被截断。最重要的是,两者都做。 @PrzemyslawKruglej 我已经添加了代码。 【参考方案1】:

尝试分解你的逻辑。这就是您从数据库中创建所有节目/季节列表的方式。

    try 
        ResultSet rs = stat.executeQuery("select * from schedule");
        List<String[]> list = new ArrayList<>();
        while (rs.next()) 
            String show = rs.getString("SHOW");
            String season = rs.getString("SEASON");
            list.add(new String[]show, season);
        
     
    catch (Exception e) 
        e.printStackTrace();
    

然后,在结果集(可能还有连接)关闭后,您应该构造 ULR 并使用此列表查询外部服务。

【讨论】:

我的工作查询也有类似的解决方案,但是我将 while 循环的 3 项合并为一行。像这样: while (resultSet.next()) jobs.add(new Input(resultSet.getString("quote_id"), "dummyValue", resultSet.getString("job_id")));

以上是关于循环遍历数据库 ResultSet的主要内容,如果未能解决你的问题,请参考以下文章

vba十万刚数据遍历怎么快

sql查询出来的内容存入map,然后把他们遍历出来

如何仅从 ResultSet 中获取第一行

C++遍历mysql结果集,一万条数据花多长时间?

pandas怎样对数据进行遍历

pandas怎样对数据进行遍历