Java,循环遍历结果集

Java,循环遍历结果集,java,jdbc,Java,Jdbc,在Java中,我有这样一个查询: String querystring1= "SELECT rlink_id, COUNT(*)" + "FROM dbo.Locate " + "GROUP BY rlink_id "; PreparedStatement ps = connection.prepareStatement(sql); try(ResultSet rs = ps.executeQuery()){

在Java中,我有这样一个查询:

String querystring1= "SELECT rlink_id, COUNT(*)"
                   + "FROM dbo.Locate  "
                   + "GROUP BY rlink_id ";
PreparedStatement ps = connection.prepareStatement(sql);
try(ResultSet rs = ps.executeQuery()){
    while(rs.next()) {
        String val = rs.getString(1);
    }
}
表rlink_id包含以下数据:

Sid        lid
 3           2
 4           4
 7           3
 9           1
如何使用Java结果集提取这些值

以下是我到目前为止的情况:

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

结果集实际上包含多行数据,并使用光标指出当前位置。因此,在您的示例中,
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
中有许多有用的方法,您应该看看:)

List sids=new ArrayList();
列表盖=新的ArrayList();
String query=“选择链接id,计数(*)”
+“从dbo.Locate”
+“按链接id分组”;
语句stmt=yourconnection.createStatement();
试一试{
ResultSet rs4=stmt.executeQuery(查询);
while(rs4.next()){
add(rs4.getString(1));
add(rs4.getString(2));
}
}最后{
stmt.close();
}
字符串show[]=sids.toArray(sids.size());
字符串actuate[]=lids.toArray(lids.size());

您的代码存在以下问题:

     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(" ");
这些数组将具有所有必需的元素

  • 应关闭结果集
  • PreparedStatement可能会保护SQL注入
  • 应最终关闭准备的报表。
因此,代码段可能如下所示:

String querystring1= "SELECT rlink_id, COUNT(*)"
                   + "FROM dbo.Locate  "
                   + "GROUP BY rlink_id ";
PreparedStatement ps = connection.prepareStatement(sql);
try(ResultSet rs = ps.executeQuery()){
    while(rs.next()) {
        String val = rs.getString(1);
    }
}

当我通过循环调用这个sid n lid时,它只给我第一行值。while循环中的rs.next()不跳过第一个结果吗?@Durin:Check javadoc of,the“cursor”实际上是在创建第一行时位于第一行之前的点:)不要忘记最后尝试关闭resultSet和语句。这是我见过的最奇怪的数组装箱方式。此外,如果您得到的字符串之一包含空格怎么办?OP存储的是int而不是字符串。所以肯定不会有任何空间。这只是创建数组的另一种方法,不同于其他人建议的方法。好的,这一次它会起作用。对我来说,这就像一个反模式。程序员应该忘记坏模式,在它导致关键系统崩溃之前学习好模式。我已经见过很多次了(很不幸)。@peperg,这里的问题是用ResultSet创建一个数组,你会同意有多种方法来实现它。我不知道是什么让你觉得这是一个反模式。这是一个有点创造性的桑托什。这不应该是一个“做一段时间”吗?迭代器是否已经处于正确的位置,可以在开始时访问第一行?(否则,为什么访问第一行的教程只能在其他情况下工作)?绝对不行(查询可能根本不会返回任何行)。你在说什么教程?好的,谢谢你解决了我的问题。。在谷歌搜索中,有一个错误的教程,现在似乎不见了。这不是跳过了第一行吗?位置自然从第一列开始。您需要执行rs4.beforeFirst();在while循环.On.next()之前,from:“ResultSet光标最初位于第一行之前”。