【问题标题】:Correct way to find rowcount in Java JDBC在 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()?似乎第二个查询来获得计数更好,每个 - stackoverflow.com/a/192104/620054

标签: java jdbc


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多