在 Java JDBC 中查找行数的正确方法

Posted

技术标签:

【中文标题】在 Java JDBC 中查找行数的正确方法【英文标题】:Correct way to find rowcount in Java JDBC 【发布时间】:2012-10-17 16:07:30 【问题描述】:

我尝试了不同的方法来获取 java JDBC 中的行数,但似乎没有一个给出正确的结果。我做错了什么吗?

即使客户表是空的并且我应该将行计数设为 0,但我不明白为什么我会得到一个非零行计数值。

方法一——

query = "SELECT * FROM customer WHERE username ='"+username+"'";
rs = stmt.executeQuery(query);
ResultSetMetaData metaData = rs.getMetaData();
rowcount = metaData.getColumnCount();

方法二——

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

【问题讨论】:

您应该执行COUNT 语句:String query = "SELECT COUNT(*) FROM customer WHERE username =?"; stmt.setString(1, username); rs = stmt.executeQuery(query); 方法 1 获取列数 - 为什么您认为这可能有效? 附带问题 - 如果您要使用原始非聚合查询中的数据,最好进行第二次查询以获取计数,还是循环并计数更好,或者跳到最后一行并检查 getRow()?似乎第二个查询来获得计数更好,每个 - ***.com/a/192104/620054 【参考方案1】:

查看这段代码:

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();
        
    

【讨论】:

这并不能真正回答问题。问题是关于他的查询(可能是任何查询)返回多少行,而不是如何查询行数。此外,此答案使用 SQL,而不是 Java。【参考方案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).");

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

谢谢..

【讨论】:

【参考方案3】:

由于方法名称指定 metaData.getColumnCount() 将返回结果集中的总列数,但不返回总行数(计数)。

【讨论】:

您还应该提供问题的解决方案,即可以使用哪个函数来获取行数 我想说“获取行数”无法从元数据中检索,因为它不是元数据,而是依赖于“真实”数据。【参考方案4】:

这是我用来在 Java 中获取行数的方式:

String query = "SELECT * FROM yourtable";

Statement st = sql.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY );
ResultSet = 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 rs.last() 会将结果集的光标移动到最后一个结果/行。 rs.beforeFirst() 会将其移回开始之前(因此任何执行 rs.next() 的进一步代码都将从开头而不是结尾开始) 你可能忘记声明 rs 问题是关于“正确方式”而不是基于意见的方式......【参考方案5】:

android 中,没有结果会返回错误。所以在 while(resultset.next())

中增加计数之前检查这种情况
if(resultset!=null)

//proceed with incrementing row count function

else

// No resultset found

【讨论】:

【参考方案6】:

只需迭代和计数

ResultSet result = sta.executeQuery("SELECT * from A3");
            int k=0;
            while(result.next())
                k++;

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

【讨论】:

以上是关于在 Java JDBC 中查找行数的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

关于mybatis更新数据的问题

java指定文件夹下查找固定的字符串并将其所在的文件名,行数,该行全部内容写入txt文件中(具体实例)

java中有没有 读取大文本文件(500MB以上),指定行数的某一行数据的类库? 有的话请给出教程,谢谢~

使用Java查找Selenium WebDriver中的分页表中的行数

Java习题(选择,冒泡排序,折半查找)

java通过jdbc查找数据,查出id值,如何通过整型变量存储这个id值