【问题标题】:Java, looping through result setJava,遍历结果集
【发布时间】:2011-11-30 09:50:45
【问题描述】:

在 Java 中,我有这样的查询:

String querystring1= "SELECT rlink_id, COUNT(*)"
                   + "FROM dbo.Locate  "
                   + "GROUP BY rlink_id ";

rlink_id 表有这个数据:

Sid        lid
 3           2
 4           4
 7           3
 9           1

如何使用 Java ResultSet 提取这些值?

这是我目前所拥有的:

String show[] = {rs4.getString(1)};
String actuate[] = {rs4.getString(2)};
asString = Arrays.toString(actuate);

【问题讨论】:

    标签: java jdbc


    【解决方案1】:
    • 应关闭 ResultSet。
    • PreparedStatement 可以防止 SQL 注入。
    • PreparedStatement 应该最终关闭。

    所以 sn-p 可能看起来像这样:

    PreparedStatement ps = connection.prepareStatement(sql);
    try(ResultSet rs = ps.executeQuery()){
        while(rs.next()) {
            String val = rs.getString(1);
        }
    }
    

    【讨论】:

      【解决方案2】:
      List<String> sids = new ArrayList<String>();
      List<String> lids = new ArrayList<String>();
      
      String query = "SELECT rlink_id, COUNT(*)"
                   + "FROM dbo.Locate  "
                   + "GROUP BY rlink_id ";
      
      Statement stmt = yourconnection.createStatement();
      try {
          ResultSet rs4 = stmt.executeQuery(query);
      
          while (rs4.next()) {
              sids.add(rs4.getString(1));
              lids.add(rs4.getString(2));
          }
      } finally {
          stmt.close();
      }
      
      String show[] = sids.toArray(sids.size());
      String actuate[] = lids.toArray(lids.size());
      

      【讨论】:

      • 不应该是“暂时”吗?迭代器是否已经在开始访问第一行的正确位置? (否则为什么访问第一行的教程只能在其他情况下工作)?
      • 绝对不是(查询可能根本不返回任何行)。你在说什么教程?
      • 好的,谢谢你解决了我的问题。U.U 有一个错误的教程在谷歌搜索中排在首位,现在似乎消失了。
      • 这不是跳过第一行吗?该位置自然从第一列开始。您需要执行 rs4.beforeFirst();在 while 循环之前。
      • On .next() from documentation: “ResultSet 游标最初位于第一行之前”
      【解决方案3】:

      您的代码的问题是:

           String  show[]= {rs4.getString(1)};
           String actuate[]={rs4.getString(2)};
      

      这将在每次循环时创建一个新数组(不是您可能假设的追加),因此最终每个数组只有一个元素。

      这是解决此问题的另一种方法:

          StringBuilder sids = new StringBuilder ();
          StringBuilder lids = new StringBuilder ();
      
          while (rs4.next()) {
              sids.append(rs4.getString(1)).append(" ");
              lids.append(rs4.getString(2)).append(" ");
          }
      
          String show[] = sids.toString().split(" "); 
          String actuate[] = lids.toString().split(" ");
      

      这些数组将包含所有必需的元素。

      【讨论】:

      • 这是我见过的最奇怪的创建数组的方法。此外,如果您得到的字符串之一包含空格怎么办?
      • OP 存储的是 int 而不是字符串。所以肯定不会有任何空间。它只是创建数组的另一种方式,不同于其他人建议的方式。
      • 好的,这次可以了。对我来说,这就像一个反模式。程序员应该忘记不良模式,并在导致严重系统崩溃之前学习好的模式。我已经看过很多次了(不幸的是)。
      • @peperg,这里的问题是从 ResultSet 创建一个数组,您会同意有多种方法可以完成它。我不知道是什么让你看到了这种反模式。
      • 这有点创意 Santosh。
      【解决方案4】:

      Result Set实际上包含多行数据,并使用游标指出当前位置。因此,在您的情况下,rs4.getString(1) 只会为您获取第一行第一列中的数据。要切换到下一行,您需要致电next()

      一个简单的例子

      while (rs.next()) {
          String sid = rs.getString(1);
          String lid = rs.getString(2);
          // Do whatever you want to do with these 2 values
      }
      

      ResultSet有很多有用的方法,你应该看看:)

      【讨论】:

      • 当我通过循环在某处调用这个 sid n lid 时,它只给我第一行值
      • while循环中的rs.next()不会跳过第一个结果吗?
      • @Durin : 检查ResultSet.next() 的javadoc,“光标”实际上是创建时的第一行之前 :)
      • 不要忘记最后尝试关闭您的结果集和语句。
      猜你喜欢
      • 2017-10-23
      • 2019-02-18
      • 2020-07-12
      • 2014-09-30
      • 2012-06-05
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      相关资源
      最近更新 更多