背景:
数据放在数据库中,然后可以接受用户指定查询n条,就展示n条,但是如果用户输入的n大于数据库中实际的总数据,那就展示实际总数据。
此时数据库有三条数据:

但是运行时,用户指定输入查询为3,却只能查到一条数据:

然后进行debug,发现总数据totalRows总是为1(实际应该为3):

错误分析:
查询语句写错了:
**错误写法:**String sql = "SELECT * FROM success";
正确写法: String sql = "SELECT COUNT(*) FROM success";
正确代码:
            
            
              java
              
              
            
          
              // 获取总历史记录数量
    private static int getTotalRowCount(Connection conn) throws SQLException{
        String sql = "SELECT COUNT(*) FROM success";
        try(PreparedStatement pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery()) {
            return rs.next() ? rs.getInt(1) : 0;
        }
    }
        
原因分析:
- 
当执行
SELECT *时,查询所有字段的所有记录 - 
rs.getInt(1)获取的是第一条记录的第一个字段的值(通常是id字段) - 
如果表中有数据,
rs.next()为true,返回的是第一条记录的id值 - 
而我们表中第一条记录的id是1,所以无论表中有多少条记录,都只返回第一条记录的id值
 
正确与错误对比:
| 正确写法 | 你的错误写法 | |
|---|---|---|
| SQL | SELECT COUNT(*) FROM success | 
SELECT * FROM success | 
| 返回结果 | 单行单列,值为总记录数 | 多行多列,所有记录数据 | 
| rs.getInt(1) | 获取总记录数 | 获取第一条记录的第一个字段值 | 
| 结果表现 | 返回真实记录总数 | 返回第一条记录的id | 
细节:
- 
聚合函数与非聚合查询的区别:
- 
COUNT(*) 是聚合函数,返回单行单列的结果
 - 
SELECT * 是普通查询,返回多行多列的结果集
 
 - 
 - 
列访问方式:
- 使用列名(如 rs.getInt("total"))比位置索引(
rs.getInt(1))更安全可靠 
 - 使用列名(如 rs.getInt("total"))比位置索引(