论坛首页 Java企业应用论坛

分页功能已经实现,怎样修改才会更合理

浏览 7537 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-15  
这个分页代码功能是实现啦,我用的是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.     }  
   发表时间:2007-08-16  
是不是和java.sql.ResultSet结合的有点紧了?
取得数据的时候可不可以通过一个接口,由客户代码决定给一个什么样的List进来,实现委托给客户的代码。int pageNum, int length扔给客户实现。

最好是实现无关,个人以为现实中可能很多情况不是用ResultSet的。
0 请登录后投票
   发表时间:2007-08-20  
同意楼上的。

如果要做成通用的分页,直接把集合传进去,再对这个集合处理应该是最好的。如果传RS可能会有内存泄露的危险。
0 请登录后投票
   发表时间:2007-08-24  
Pager就是pager,它只应该是一个记录分页信息的model
最好不要把它和resultset这样的类耦合

然后getAccountList中,从Pager读取startRow和Length,组合翻页的sql,最好在通过select count(1) from 的方式在发起一起查询,查出总记录数,然后把总记录数回填到Pager中,最后把pager和分页查询出的记录集一起给页面显示
0 请登录后投票
   发表时间:2007-08-24  
MS 可以用hibernate去实现读取数据,这样就通用了
0 请登录后投票
   发表时间:2007-08-29  
tabletags是struts2.0很好的一个实现,可以直接使用

数据访问结构建议用hibernate,比较省事
0 请登录后投票
   发表时间:2007-08-29  

dongguoh 写道:
这个分页代码功能是实现啦,我用的是Mysql的数据库
请你们给些意见,该怎样修改才会使它会更好用,并且更合理
 
java 代码
 
  1. //取得每页显示的数量条数   
  2.     public List getAccountList(HttpServletRequest request, int pageNum, int length) {   
  3.         List<account> list = </account>new ArrayList<account>();   </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.     }  


getAccountList这个是客户代码,客户传入的是全表数据,感觉实际情况下,大部分分页不会做全表查询的,只要大一点数据量的应用,128M heap应该是会OutOfMemory。所以个人认为设计给客户的接口不是太实用的。
0 请登录后投票
   发表时间:2007-08-29  
分页可以参考这里
http://www.speedframework.cn/bbs/viewthread.php?tid=89&extra=page%3D2


0 请登录后投票
   发表时间:2007-08-30  
用ResultSet分页效率太低了,最好能直接利用数据库本身的能力
如果要考虑支持不同的数据库,可以定义一个接口,针对不同的数据库分别实现
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics