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对象获取来得实惠。

猜你喜欢

转载自paladin1988.iteye.com/blog/1842734