这个分页代码功能是实现啦,我用的是Mysql的数据库
请你们给些意见,该怎样修改才会使它会更好用,并且更合理
java 代码
  1. package com.gjx.util;   
  2.   
  3. import java.sql.ResultSet;   
  4. import java.sql.SQLException;   
  5.   
  6. import org.apache.commons.logging.Log;   
  7. import org.apache.commons.logging.LogFactory;   
  8.   
  9. public class Pager {   
  10.     private static final Log logger=LogFactory.getLog(Pager.class);   
  11.     //总的行数   
  12.     private int count;   
  13.     //每页显示的数量      
  14.     private int length;   
  15.     //偏移量   
  16.     private int offset;   
  17.     //总共有多少页   
  18.     private int  size;   
  19.     //所传进来的页码数为   
  20.     private int pageNum;   
  21.     ResultSet rs=null;   
  22.        
  23.        
  24.     public Pager(ResultSet rs,int pageNum,int length){   
  25.         this.rs=rs;   
  26.         this.length=length;   
  27.         this.pageNum=pageNum;   
  28.     }   
  29.     public int getRows(){   
  30.         try {   
  31.             rs.last();   
  32.             count =rs.getRow();   
  33.             rs.first();   
  34.         } catch (SQLException e) {   
  35.             logger.error("取得数据结果集行数时出错"+e);   
  36.         }   
  37.         return count;          
  38.     }   
  39.     public int getSize(){   
  40.   
  41.         size=(this.getRows()%this.length)==0?this.getRows()/this.length:this.getRows()/this.length+1;   
  42.         return size;   
  43.     }   
  44.     public int getOffset(){    
  45.         this.getRows();   
  46.         this.getSize();        
  47.         offset=(this.pageNum-1)*length>=0?(this.pageNum-1)*length:0;   
  48.   
  49.         return offset;   
  50.     }   
  51.   
  52. }   

 

 

java 代码
  1. //取得每页显示的数量条数   
  2.     public List getAccountList(HttpServletRequest request, int pageNum, int length) {   
  3.         List<Account> list = new ArrayList<Account>();   
  4.         String sql = "select * from account";   
  5.         //HttpServletRequest request=null;   
  6.   
  7.         try {   
  8.             // conn = dbc.getConnection();   
  9.             conn = Factory.getDBConnection().getConnection();   
  10.             stmt = conn.createStatement();             
  11.             rs = stmt.executeQuery(sql);   
  12.             Pager pager=new Pager(rs,pageNum,length);   
  13.             request.setAttribute("size",pager.getSize());   
  14.             sql = "select * from account limit "+pager.getOffset()+","+length;   
  15.             rs = stmt.executeQuery(sql);   
  16.             while (rs.next()) {   
  17.                 Account account = new Account();   
  18.                 account.setUserId(rs.getString("userId"));   
  19.                 account.setUsername(rs.getString("username"));   
  20.                 account.setPassword(rs.getString("password"));   
  21.                 account.setLevel(rs.getInt("level"));   
  22.                 account.setEmail(rs.getString("email"));   
  23.                 list.add(account);   
  24.             }   
  25.             this.close();   
  26.         } catch (SQLException e) {   
  27.             System.err.println("当执行静态的Statement 语句 时出错,错误原因:" + e);   
  28.             e.printStackTrace();   
  29.         }   
  30.   
  31.         return list;   
  32.     }  
评论
movingboy 2007-08-30
用ResultSet分页效率太低了,最好能直接利用数据库本身的能力
如果要考虑支持不同的数据库,可以定义一个接口,针对不同的数据库分别实现
viewtifuljoey 2007-08-29

dongguoh 写道:
这个分页代码功能是实现啦,我用的是Mysql的数据库
请你们给些意见,该怎样修改才会使它会更好用,并且更合理
 
java 代码
 
  1. //取得每页显示的数量条数   
  2.     public List getAccountList(HttpServletRequest request, int pageNum, int length) {   
  3.         List list = new ArrayList();   
  4.         String sql = "select * from account";   
  5.         //HttpServletRequest request=null;   
  6.   
  7.         try {   
  8.             // conn = dbc.getConnection();   
  9.             conn = Factory.getDBConnection().getConnection();   
  10.             stmt = conn.createStatement();             
  11.             rs = stmt.executeQuery(sql);   
  12.             Pager pager=new Pager(rs,pageNum,length);   
  13.             request.setAttribute("size",pager.getSize());   
  14.             sql = "select * from account limit "+pager.getOffset()+","+length;   
  15.             rs = stmt.executeQuery(sql);   
  16.             while (rs.next()) {   
  17.                 Account account = new Account();   
  18.                 account.setUserId(rs.getString("userId"));   
  19.                 account.setUsername(rs.getString("username"));   
  20.                 account.setPassword(rs.getString("password"));   
  21.                 account.setLevel(rs.getInt("level"));   
  22.                 account.setEmail(rs.getString("email"));   
  23.                 list.add(account);   
  24.             }   
  25.             this.close();   
  26.         } catch (SQLException e) {   
  27.             System.err.println("当执行静态的Statement 语句 时出错,错误原因:" + e);   
  28.             e.printStackTrace();   
  29.         }   
  30.   
  31.         return list;   
  32.     }  


getAccountList这个是客户代码,客户传入的是全表数据,感觉实际情况下,大部分分页不会做全表查询的,只要大一点数据量的应用,128M heap应该是会OutOfMemory。所以个人认为设计给客户的接口不是太实用的。
wolfwood 2007-08-29
tabletags是struts2.0很好的一个实现,可以直接使用

数据访问结构建议用hibernate,比较省事
blu3leaf 2007-08-24
MS 可以用hibernate去实现读取数据,这样就通用了
leeon 2007-08-24
Pager就是pager,它只应该是一个记录分页信息的model
最好不要把它和resultset这样的类耦合

然后getAccountList中,从Pager读取startRow和Length,组合翻页的sql,最好在通过select count(1) from 的方式在发起一起查询,查出总记录数,然后把总记录数回填到Pager中,最后把pager和分页查询出的记录集一起给页面显示
xiaoxiaodi5834 2007-08-20
同意楼上的。

如果要做成通用的分页,直接把集合传进去,再对这个集合处理应该是最好的。如果传RS可能会有内存泄露的危险。
refactoring 2007-08-16
是不是和java.sql.ResultSet结合的有点紧了?
取得数据的时候可不可以通过一个接口,由客户代码决定给一个什么样的List进来,实现委托给客户的代码。int pageNum, int length扔给客户实现。

最好是实现无关,个人以为现实中可能很多情况不是用ResultSet的。
dongguoh
  • 浏览: 16319 次
  • 性别: Icon_minigender_1
  • 来自: 山水之乡
  • 详细资料
搜索本博客
最近加入圈子
存档
最新评论