2007-08-15
分页功能已经实现,怎样修改才会更合理
这个分页代码功能是实现啦,我用的是Mysql的数据库
请你们给些意见,该怎样修改才会使它会更好用,并且更合理
java 代码
- package com.gjx.util;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- public class Pager {
- private static final Log logger=LogFactory.getLog(Pager.class);
- //总的行数
- private int count;
- //每页显示的数量
- private int length;
- //偏移量
- private int offset;
- //总共有多少页
- private int size;
- //所传进来的页码数为
- private int pageNum;
- ResultSet rs=null;
- public Pager(ResultSet rs,int pageNum,int length){
- this.rs=rs;
- this.length=length;
- this.pageNum=pageNum;
- }
- public int getRows(){
- try {
- rs.last();
- count =rs.getRow();
- rs.first();
- } catch (SQLException e) {
- logger.error("取得数据结果集行数时出错"+e);
- }
- return count;
- }
- public int getSize(){
- size=(this.getRows()%this.length)==0?this.getRows()/this.length:this.getRows()/this.length+1;
- return size;
- }
- public int getOffset(){
- this.getRows();
- this.getSize();
- offset=(this.pageNum-1)*length>=0?(this.pageNum-1)*length:0;
- return offset;
- }
- }
java 代码
- //取得每页显示的数量条数
- public List getAccountList(HttpServletRequest request, int pageNum, int length) {
- List<Account> list = new ArrayList<Account>();
- String sql = "select * from account";
- //HttpServletRequest request=null;
- try {
- // conn = dbc.getConnection();
- conn = Factory.getDBConnection().getConnection();
- stmt = conn.createStatement();
- rs = stmt.executeQuery(sql);
- Pager pager=new Pager(rs,pageNum,length);
- request.setAttribute("size",pager.getSize());
- sql = "select * from account limit "+pager.getOffset()+","+length;
- rs = stmt.executeQuery(sql);
- while (rs.next()) {
- Account account = new Account();
- account.setUserId(rs.getString("userId"));
- account.setUsername(rs.getString("username"));
- account.setPassword(rs.getString("password"));
- account.setLevel(rs.getInt("level"));
- account.setEmail(rs.getString("email"));
- list.add(account);
- }
- this.close();
- } catch (SQLException e) {
- System.err.println("当执行静态的Statement 语句 时出错,错误原因:" + e);
- e.printStackTrace();
- }
- return list;
- }
评论
movingboy
2007-08-30
用ResultSet分页效率太低了,最好能直接利用数据库本身的能力
如果要考虑支持不同的数据库,可以定义一个接口,针对不同的数据库分别实现
如果要考虑支持不同的数据库,可以定义一个接口,针对不同的数据库分别实现
santafeng
2007-08-29
viewtifuljoey
2007-08-29
dongguoh 写道:
这个分页代码功能是实现啦,我用的是Mysql的数据库
请你们给些意见,该怎样修改才会使它会更好用,并且更合理
java 代码
- //取得每页显示的数量条数
- public List getAccountList(HttpServletRequest request, int pageNum, int length) {
- List
list = new ArrayList(); - String sql = "select * from account";
- //HttpServletRequest request=null;
- try {
- // conn = dbc.getConnection();
- conn = Factory.getDBConnection().getConnection();
- stmt = conn.createStatement();
- rs = stmt.executeQuery(sql);
- Pager pager=new Pager(rs,pageNum,length);
- request.setAttribute("size",pager.getSize());
- sql = "select * from account limit "+pager.getOffset()+","+length;
- rs = stmt.executeQuery(sql);
- while (rs.next()) {
- Account account = new Account();
- account.setUserId(rs.getString("userId"));
- account.setUsername(rs.getString("username"));
- account.setPassword(rs.getString("password"));
- account.setLevel(rs.getInt("level"));
- account.setEmail(rs.getString("email"));
- list.add(account);
- }
- this.close();
- } catch (SQLException e) {
- System.err.println("当执行静态的Statement 语句 时出错,错误原因:" + e);
- e.printStackTrace();
- }
- return list;
- }
getAccountList这个是客户代码,客户传入的是全表数据,感觉实际情况下,大部分分页不会做全表查询的,只要大一点数据量的应用,128M heap应该是会OutOfMemory。所以个人认为设计给客户的接口不是太实用的。
wolfwood
2007-08-29
tabletags是struts2.0很好的一个实现,可以直接使用
数据访问结构建议用hibernate,比较省事
数据访问结构建议用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和分页查询出的记录集一起给页面显示
最好不要把它和resultset这样的类耦合
然后getAccountList中,从Pager读取startRow和Length,组合翻页的sql,最好在通过select count(1) from 的方式在发起一起查询,查出总记录数,然后把总记录数回填到Pager中,最后把pager和分页查询出的记录集一起给页面显示
xiaoxiaodi5834
2007-08-20
同意楼上的。
如果要做成通用的分页,直接把集合传进去,再对这个集合处理应该是最好的。如果传RS可能会有内存泄露的危险。
如果要做成通用的分页,直接把集合传进去,再对这个集合处理应该是最好的。如果传RS可能会有内存泄露的危险。
refactoring
2007-08-16
是不是和java.sql.ResultSet结合的有点紧了?
取得数据的时候可不可以通过一个接口,由客户代码决定给一个什么样的List进来,实现委托给客户的代码。int pageNum, int length扔给客户实现。
最好是实现无关,个人以为现实中可能很多情况不是用ResultSet的。
取得数据的时候可不可以通过一个接口,由客户代码决定给一个什么样的List进来,实现委托给客户的代码。int pageNum, int length扔给客户实现。
最好是实现无关,个人以为现实中可能很多情况不是用ResultSet的。
- 浏览: 16319 次
- 性别:

- 来自: 山水之乡

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
Spring 中继承的实现
...
-- by xiao1955323 -
美丽的家乡(图多多)
贵州是个好地方:火锅大大得便宜!山水大大的漂亮!房子大大的便宜! 就是那边买衣服 ...
-- by citi.sh -
Spring 中事件的传递
替楼主加一下文字说明~见笑了~
-- by citi.sh -
Spring 中事件的传递
ApplocationContext中的事件处理是通过ApplicationEv ...
-- by citi.sh -
解决了struts2.0 严重: ...
这个错之前从来没见过,先试试你得办法吧!谢啦
-- by xiaxiaojuan







评论排行榜