转载自:http://blog.csdn.net/youzhouliu/article/details/52037499

场景:

 

 
  1. Class.forName("com.mysql.jdbc.Driver");  
  2. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","haha","haha");  
  3. String sql = "select * from gonglue";  
  4. PreparedStatement ps = conn.prepareStatement(sql);  
  5. ResultSet rs = ps.executeQuery();  
  6.   
  7.  count = rs.getFetchSize()  

结果count值是0,gonglue表有数据的

 

原因分析:

getFetchSize()方法不是获得记录数,而是获得每次抓取的记录数,默认是0,也就是说不限制。可以用setFetchSize()来设置,而getFetchSize()是用来读出那个设置值。设置为正整数之后,ResultSet每次抓取的最多纪录数就有了上限,而不是所有符合条件的记录。

 

 

如果你是想获得符合条件的记录数目,最少有3种方法 

方法一:

 

 
  1. count=0;  
  2. while(resultSet.next()){   
  3. count++;  
  4. }   

 

方法二:

 

 
  1. resultSet.last();  
  2. count=resultSet.getRow();  

 

方法三:

 

 
  1. String sql = "select count(*) totalCount from gonglue";  
  2. count=rs.getInt("totalCount");  


 

获得ResultSet的记录个数

因为ResultSet没有方法可直接得到记录数,只有另想方法,可采用如下方法:

 

 
  1. Statement stmt = db.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);  
  2. ResultSet rs = stmt.executeQuery(sql);  
  3. rs.last();//移到最后一行  
  4. int count = rs.getRow();  
  5. rs.beforeFirst();//移到初始位置  


 

注意:

因为默认的 ResultSet 对象仅有一个向前移动的光标,必须将ResultSet指定为可滚动的。所以第一行代码是必须的,否则会报如下错误:

 

 
  1. ResultSet may only be accessed in a forward direction  


 

ResultSet类的createStatement(int resultSetType, int resultSetConcurrency);方法中,参数一为结果集类型,可取值为

1)ResultSet.TYPE_FORWORD_ONLY,结果集只可向前滚动;

2)ResultSet.TYPE_SCROLL_INSENSITIVE,双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。

3)ResultSet.TYPE_SCROLL_SENSITIVE,双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。

 

参数二为结果集可进行的操作,可取值为:

1)ResultSet.CONCUR_READ_ONLY 只读

2)ResultSet.CONCUR_UPDATABLE 可修改

 

 

知识扩充:获得ResultSet的字段个数  

使用rs.getMetaData()方法,该方法的返回类型是ResultSetMetaData,在这个类中调用getColumnCount()方法,即可得到字段个数。  

       代码如下:


 

 
    1. ResultSetMetaData rsmd1 = rs.getMetaData();  
    2. int count = rsmd1.getColumnCount();  
posted on 2017-08-14 22:44  blythe  阅读(495)  评论(0)    收藏  举报