`
paladin1988
  • 浏览: 326294 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

请您先登录,才能继续操作

JDBC获取记录总数

    博客分类:
  • JDBC
 
阅读更多

 

参考资料:

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

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

 

感谢上面的两位。。

 

JDBC中的ResultSet API没有直接获取记录条数的方法,现介绍几个:

方法一:利用ResultSet的getRow方法来获得ResultSet的总行数
Java代码

 ResultSet rs;   
 rs.last(); //移到最后一行   
 int rowCount = rs.getRow(); //得到当前行号,也就是记录数   
 rs.beforeFirst(); //如果还要用结果集,就把指针再移到初始化的位置  


方法二:利用循环ResultSet的元素来获得ResultSet的总行数
Java代码

 ResultSet rs;   
int rowCount = 0;    
 while(rset.next())    
 {    
     rowCount++;    
 }  


方法三:利用sql语句中的count函数获得ResultSet的总行数
Java代码

String sql = "select count(*) record_ from ( select * from yourtable t where t.column_ = 'value_' )";   
 ResultSet rs = ps.executeQuery(sql);    
 int rowCount = 0;    
 if(rs.next())    
 {    
   //   rowCount=rs.getInt("record_");    
    rowCount = rs.getInt(1);
} 

 

 

具体见下面的:

 

	public static void main(String[] args) throws SQLException {
		test1();
		test2();
		test3();
	}
	
	//使用ResultSet的getRow()方法获取
	public static void test1() throws SQLException {
		String sql = "select * from student";
		Connection conn = JdbcUtils.getConnection();
		Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
				ResultSet.CONCUR_UPDATABLE);
		ResultSet rs = stmt.executeQuery(sql);
		rs.last();
		System.out.println("Total Size = " + rs.getRow());
		rs.close();
		stmt.close();
		conn.close();
	}
	
	//迭代统计
	public static void test2() throws SQLException {
		String sql = "select * from student";
		Connection conn = JdbcUtils.getConnection();
		Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
				ResultSet.CONCUR_UPDATABLE);
		ResultSet rs = stmt.executeQuery(sql);
		Integer count = 0;
		while (rs.next()) {
			count++;
		}
		System.out.println("Total Size = " + count);
		rs.close();
		stmt.close();
		conn.close();
	}
	
	//通过count()获取记录总数
	public static void test3() throws SQLException {
		String sql = "select count(1) from student";
		Connection conn = JdbcUtils.getConnection();
		Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
				ResultSet.CONCUR_UPDATABLE);
		ResultSet rs = stmt.executeQuery(sql);
		int count = 0;
		if (rs.next()) {
			count = rs.getInt(1);
		}
		System.out.println("Total Size = " + count);
		rs.close();
		stmt.close();
		conn.close();
	}

 

 

三种方法的性能比较:

 

测试代码:
//================================================================================================
//公用代码
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对象获取来得实惠。

 

 

 

 

 

分享到:
评论

相关推荐

    Java实现获得MySQL数据库中所有表的记录总数可行方法

    在Java编程中,获取MySQL数据库中所有表的记录总数是一个常见的需求,特别是在数据分析或者性能监控场景下。本文将介绍两种有效的方法来实现这一目标,通过编写Java程序与MySQL数据库进行交互。 首先,我们需要确保...

    JDBC简单分页方案

    基本思路是首先初始化分页参数,如页面大小(pageSize)、当前页(currentPage)、记录总数(countOfRows)以及页面总数(countOfPages)。通过这些参数可以计算出要显示的记录范围。在读取记录时,使用`absolute...

    PowerBuilder中使用JDBC连接MYSQL无法使用COUNT(*)MAX()函数

    -- 示例:获取表yk_cddz中的记录总数 SELECT COUNT(*) INTO :ll_count FROM yk_cddz; -- 示例:获取表yk_cddz中的某列最大值 SELECT MAX(column_name) INTO :max_value FROM yk_cddz; ``` 通过上述步骤,应该可以...

    与JDBC兼容性的分页

    1. **获取总记录数**:首先执行一个统计查询(通常使用`COUNT(*)`),以确定满足条件的记录总数。 2. **计算分页参数**:根据总记录数、每页显示的记录数以及当前页码,计算出具体的分页参数。 3. **执行分页查询**...

    JDBC部分 精华总结

    通常用于获取表中的总记录数。 - **`COUNT(id)`**:仅统计指定列中非NULL值的行数。如果某行的`id`列为空,则不会被计入总数。 #### 三、SQL查询示例 **查询年龄大于20岁且名字以“王”开头并在名字中含有%的记录...

    jdbc 逻辑分页

    这个计数操作对性能有影响,特别是在大数据量时,因此在设计系统时需要权衡是否每次分页都需要获取总数。 2. **设置分页参数**:通常我们会设定每页显示的记录数(pageSize)和当前页数(pageNumber)。根据这些...

    分页显示数据库记录

    在ACCESS中,可以使用`SELECT COUNT(*) FROM table_name`获取记录总数。 5. **用户交互**:当用户点击分页按钮或输入页码时,需要更新SQL查询以获取新的记录范围,并重新加载页面。 在编程实现分页时,通常会用到...

    JSP连接SQL数据库实现数据分页显示

    - **`totalItem`**: 计算记录总数,通过查询数据库获取。 - **`totalPage`**: 计算总页数。该值由 `totalItem` 和 `pageSize` 计算得出:`(totalItem + pageSize - 1) / pageSize`。 - **`curPage`**: 当前显示的...

    SQL Server存储过程同时返回分页结果集和总数

     好长时间没摸数据库了,周末在家写了个报表的存储过程,一时间对使用存储过程实现分页的同时并计算出记录总数不知道怎么更好的去实现。按照我们正常的业务逻辑,存储过程数据首先是分页,其次接受若干查询条件,...

    jsp实现翻页如果有兴趣可以参考

    本文详细介绍了如何在JSP中实现翻页功能,包括了运行前的准备工作、变量声明与初始化、加载JDBC驱动及数据库连接、获取记录总数及计算总页数、数据展示及翻页链接等关键步骤。通过本例的学习,开发者可以更加深入地...

    JSP分页代码-数据库连接池+JavaBean+JSP+SQL Server+JDBC3.0的数据库分页技术

    public int getCountTopic()//获取记录总数。 { return intCountTopic; } public int getPageCount() //获取总页数。 { return intPageCount; } public int getIntPage() //获取当前页数。 { return int...

    oracle 存储过程分页

    1. **记录总数查询**:通过执行`select count(*)`语句来获取记录总数。 2. **计算总页数**:根据记录总数和每页显示的条数计算出总页数。 3. **校验当前页码**:如果当前页码大于总页数,则将其设置为总页数。 4. **...

    JSP数据库操作例程(Use Bean)

    在JSP页面中,还定义了一个`ResultSet`变量`rst`,并且通过`rst.last()`方法移动到结果集的末尾,从而获取记录总数`rowCount`。然后计算出总页数`pageCount`,并根据请求参数`page`确定当前页数`intPage`。 页面...

    jsp + oracle分页简单实用

    - 使用`ResultSet`对象的`last()`方法移动结果集指针到最后一条记录,然后调用`getRow()`方法获取记录总数。 - 根据记录总数和每页显示的记录数计算出总页数。 6. **分页显示数据**: - 将结果集指针定位到当前页...

    JSP分页代码 JSP分页代码.doc

    接着,创建一个Statement对象,用于执行SQL语句,并设置为滚动的只读模式,以便于获取记录总数。 4. **SQL查询与分页**:查询语句`"select * from etsa"`选择表`etsa`中的所有列。`sqlRst.executeQuery(strSQL)`...

    jsp分页技术

    // 获取记录总数 sqlRst.last(); int RowCount = sqlRst.getRow(); // 计算总页数 int PageCount = (int) ((RowCount + intPageSize - 1) / intPageSize); // 调整待显示的页码 if (intPage &gt; intPageCount) intPage...

    目前最好的JSP分页技术

    1. **查询总记录数**:首先需要获取满足条件的记录总数,以便计算总页数和当前页显示的数据范围。 2. **计算页码和数据偏移量**:根据用户请求的页码和每页显示的记录数,计算出数据的起始位置和结束位置。 3. *...

    用jsp访问数据库

    调用`ResultSet`的`next()`方法移动到查询结果的第一行,并使用`getInt()`方法获取记录总数。 5. **分页显示数据**: 示例代码中还实现了分页功能,每次显示5条记录。通过计算总页数和当前页码,代码确定了应显示...

Global site tag (gtag.js) - Google Analytics