JDBC获取记录总数

原文链接

参考资料:

http://blog.csdn.net/chenzhanhai/article/details/6257066

http://hi.baidu.com/nboy2006/item/f05d89f3023301de6225d27b

 

感谢上面的两位。。

 

Java代码   收藏代码
  1. JDBC中的ResultSet API没有直接获取记录条数的方法,现介绍几个:  
  2.   
  3. 方法一:利用ResultSet的getRow方法来获得ResultSet的总行数  
  4. Java代码  
  5.   
  6.  ResultSet rs;     
  7.  rs.last(); //移到最后一行     
  8.  int rowCount = rs.getRow(); //得到当前行号,也就是记录数     
  9.  rs.beforeFirst(); //如果还要用结果集,就把指针再移到初始化的位置    
  10.   
  11.   
  12. 方法二:利用循环ResultSet的元素来获得ResultSet的总行数  
  13. Java代码  
  14.   
  15.  ResultSet rs;     
  16. int rowCount = 0;      
  17.  while(rset.next())      
  18.  {      
  19.      rowCount++;      
  20.  }    
  21.   
  22.   
  23. 方法三:利用sql语句中的count函数获得ResultSet的总行数  
  24. Java代码  
  25.   
  26. String sql = "select count(*) record_ from ( select * from yourtable t where t.column_ = 'value_' )";     
  27.  ResultSet rs = ps.executeQuery(sql);      
  28.  int rowCount = 0;      
  29.  if(rs.next())      
  30.  {      
  31.    //   rowCount=rs.getInt("record_");      
  32.     rowCount = rs.getInt(1);  
  33. }   

 

 

具体见下面的:

 

Java代码   收藏代码
  1. public static void main(String[] args) throws SQLException {  
  2.     test1();  
  3.     test2();  
  4.     test3();  
  5. }  
  6.   
  7. //使用ResultSet的getRow()方法获取  
  8. public static void test1() throws SQLException {  
  9.     String sql = "select * from student";  
  10.     Connection conn = JdbcUtils.getConnection();  
  11.     Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,  
  12.             ResultSet.CONCUR_UPDATABLE);  
  13.     ResultSet rs = stmt.executeQuery(sql);  
  14.     rs.last();  
  15.     System.out.println("Total Size = " + rs.getRow());  
  16.     rs.close();  
  17.     stmt.close();  
  18.     conn.close();  
  19. }  
  20.   
  21. //迭代统计  
  22. public static void test2() throws SQLException {  
  23.     String sql = "select * from student";  
  24.     Connection conn = JdbcUtils.getConnection();  
  25.     Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,  
  26.             ResultSet.CONCUR_UPDATABLE);  
  27.     ResultSet rs = stmt.executeQuery(sql);  
  28.     Integer count = 0;  
  29.     while (rs.next()) {  
  30.         count++;  
  31.     }  
  32.     System.out.println("Total Size = " + count);  
  33.     rs.close();  
  34.     stmt.close();  
  35.     conn.close();  
  36. }  
  37.   
  38. //通过count()获取记录总数  
  39. public static void test3() throws SQLException {  
  40.     String sql = "select count(1) from student";  
  41.     Connection conn = JdbcUtils.getConnection();  
  42.     Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,  
  43.             ResultSet.CONCUR_UPDATABLE);  
  44.     ResultSet rs = stmt.executeQuery(sql);  
  45.     int count = 0;  
  46.     if (rs.next()) {  
  47.         count = rs.getInt(1);  
  48.     }  
  49.     System.out.println("Total Size = " + count);  
  50.     rs.close();  
  51.     stmt.close();  
  52.     conn.close();  
  53. }  

 

 

三种方法的性能比较:

 

测试代码:
//================================================================================================
//公用代码
Connection cn = DBManager.getConn("jdbc:oracle:thin:u/p@dbs:1521:orcl");
String selectSQL = "SELECT COL1 FROM TB1";

//各方式代码……

DBManager.closeConn(cn);

//================================================================================================
//方式一:利用ResultSet的getRow方法
Statement stmt = cn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(selectSQL);

rs.last();
logger.info("利用ResultSet的getRow方法:" + rs.getRow());

rs.close();
stmt.close();

//================================================================================================
//方式二:自行迭代方式
Statement stmt = cn.createStatement();
ResultSet rs = stmt.executeQuery(selectSQL);

int i = -1;

while (rs.next()) {
i++;
}

logger.info("自行迭代方式:" + i);

rs.close();
stmt.close();

//================================================================================================
//方式三:SELECT COUNT(*) FROM (SQL)方式
String newSQL = "SELECT COUNT(1) AS CT FROM (" + selectSQL + ")";
Statement stmt = cn.createStatement();
ResultSet rs = stmt.executeQuery(newSQL);

rs.next();
logger.info("SELECT COUNT(1) AS CT FROM (SQL)方式:" + rs.getInt(1));

rs.close();
stmt.close();

//================================================================================================

以下是对 7000 条数据的测试结果

1,利用ResultSet的getRow方法

<耗时>:906(ms)。
<耗时>:860(ms)。
<耗时>:781(ms)。
<耗时>:766(ms)。
<耗时>:797(ms)。

2,自行迭代方式

<耗时>:672(ms)。
<耗时>:688(ms)。
<耗时>:672(ms)。
<耗时>:687(ms)。
<耗时>:688(ms)。

3,SELECT COUNT(1) AS CT FROM (SQL)方式

<耗时>:500(ms)。
<耗时>:484(ms)。
<耗时>:500(ms)。
<耗时>:484(ms)。
<耗时>:500(ms)。

 

总体上看,三种方式貌视差不大,相互间仅100、200ms的差别。

从测试结果看,第三种方式效率最高,自行迭代次之,ResultSet的getRow方法效率最低。

由此看来,要获取 一条SQL查询语句返回的记录数,单执行一条SQL去获取要比通过ResultSet对象获取来得实惠。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 JDBC(Java Database Connectivity)来连接数据库并获取表中的字段。以下是一个简单的示例代码,演示如何使用 JDBC 获取表中的字段: ```java import java.sql.*; public class JDBCTest { public static void main(String[] args) { // 数据库连接信息 String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password"; try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立数据库连接 Connection conn = DriverManager.getConnection(url, username, password); // 创建 Statement 对象 Statement stmt = conn.createStatement(); // 执行 SQL 查询 String sql = "SELECT * FROM mytable"; ResultSet rs = stmt.executeQuery(sql); // 获取结果集的元数据信息 ResultSetMetaData rsmd = rs.getMetaData(); // 获取字段数量 int columnCount = rsmd.getColumnCount(); System.out.println("表中字段数量:" + columnCount); // 输出每个字段的名称和类型 for (int i = 1; i <= columnCount; i++) { String columnName = rsmd.getColumnName(i); String columnType = rsmd.getColumnTypeName(i); System.out.println("字段名称:" + columnName + ",字段类型:" + columnType); } // 关闭连接 rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,您需要将 `url`、`username` 和 `password` 替换为您实际的数据库连接信息。然后,通过执行 SQL 查询并使用 `ResultSetMetaData` 获取结果集的元数据信息,包括字段数量、字段名称和字段类型。 请注意,在实际开发中,您可能需要根据具体的数据库类型和表结构进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值