在Java JDBC中正确获取行数的方法

9
我尝试了不同的方法来获取Java JDBC中的行数,但是似乎没有一个给出正确的结果。我做错了什么吗?
即使客户表为空,我应该得到0行计数,但是我不明白为什么会得到非零行计数值。
方法1 -
query = "SELECT * FROM customer WHERE username ='"+username+"'";
rs = stmt.executeQuery(query);
ResultSetMetaData metaData = rs.getMetaData();
rowcount = metaData.getColumnCount();

方法2 -

query = "SELECT * FROM customer WHERE username ='"+username+"'";
rs = stmt.executeQuery(query);
rowcount = rs.last() ? rs.getRow() : 0;

4
你应该执行一条 COUNT 语句:String query = "SELECT COUNT(*) FROM customer WHERE username =?"; stmt.setString(1, username); rs = stmt.executeQuery(query); - Luiggi Mendoza
4
方法1获取列数 - 你觉得这可能有效吗? - mmmmmm
旁边的问题 - 如果您要使用原始非聚合查询中的数据,是更好地执行第二个查询以获取计数,还是最好循环并计数,或跳转到最后一行并检查getRow()?看起来,根据 https://dev59.com/KHVC5IYBdhLWcg3ww0Hr#192104,执行第二个查询以获取计数更好。 - Michael K
6个回答

14

请看这段代码片段:

import java.io.*;
import java.sql.*;

public class CountRows{
    public static void main(String[] args) {
        System.out.println("Count number of rows in a specific table!");
        Connection con = null;
        int count = 0;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctutorial","root","root");
            try {
                Statement st = con.createStatement();
                BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Enter table name:");
                String table = bf.readLine();
                ResultSet res = st.executeQuery("SELECT COUNT(*) FROM "+table);
                while (res.next()){
                    count = res.getInt(1);
                }
                System.out.println("Number of row:"+count);
            }
            catch (SQLException s){
                System.out.println("SQL statement is not executed!");
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

1
这并没有真正回答问题。问题是关于他的查询(可能是任何查询)返回多少行,而不是如何查询行数。此外,这个答案使用的是SQL,而不是Java。 - mightycpa

4

在Java中获取行数的方式如下:

String query = "SELECT * FROM yourtable";

Statement st = sql.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY );
ResultSet rs = st.executeQuery(query);

int rows = 0;
rs.last();
rows = rs.getRow();
rs.beforeFirst();

System.out.println("Your query have " + rows + " rows.");

你为什么要执行rs.last()和rs.beforeFirst()? - Oliver
1
@Oliver rs.last() 将移动 ResultSet 的光标到最后一个结果/行。rs.beforeFirst() 将其移到开始之前(这样做任何进一步的 rs.next() 代码将从开头而不是末尾开始)。 - Michael K
您可能忘记声明rs。 - user8758751
问题是关于“正确的方式”,而不是基于个人观点的方式... - Yousha Aleayoub

2

当您使用不支持TYPE_FORWARD_ONLY的JDBC时,请使用此方法获取行数。

Statement s = cd.createStatement();
ResultSet r = s.executeQuery("SELECT COUNT(*) AS rowcount FROM TableName");
r.next();
int count = r.getInt("rowcount");
r.close();
System.out.println("MyTable has " + count + " row(s).");

您可以使用上述方法获取行数。
谢谢。

1
在Android中,没有结果会返回一个错误。因此,在递增计数之前,请检查这种情况 while(resultset.next())
if(resultset!=null)
{
//proceed with incrementing row count function
}
else
{
// No resultset found
}

0
只需迭代和计数。
ResultSet result = sta.executeQuery("SELECT * from A3");
            int k=0;
            while(result.next())
                k++;

            System.out.print(k); //k is the no of row

-1

正如方法名所示,metaData.getColumnCount()将返回结果集中列的总数,而不是行的总数(计数)。


你还应该提供一个问题的解决方案,即可以使用哪个函数来获取行数。 - mynawaz
我会说“获取行数”无法从元数据中检索,因为它不是元数据,而是依赖于“真实”数据。 - Krischu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接