背景:
数据放在数据库中,然后可以接受用户指定查询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"))比位置索引(