ecside 数据库层分页解决方案

 

       项目中使用到了ecside,不过没有使用到分页技术,每次都是吧数据库所有的记录给查出来,放到request对象中,然后ecside展示,前台的ecside拿到了request对象中的数据list,根据页面上用户选择的每页显示巨鹿数目,计算出一共多少页,比如记录有10页,当前是第一页,你点第二页,ecside也是在去查一下数据库,把所有的记录找出来,根据每页显示的记录数目,计算出第二页显示的数据记录的起止位置,然后在页面上显示,当数据量巨大的时候,不使用分页就会出现OOM的问题,以下是ecside基于数据库分页的一个简单实现,每次按需取数据,不管记录再多,也不会OOM

 

 

     准备工作:

 

 

1. ecsise 2.0 相关jar包+Mysql 数据库环境+struts

2.在mysql 中建立一个表

CREATE TABLE `user` (                
          `name` varchar(20) NOT NULL,       
          `age` varchar(20) NOT NULL,        
          `sex` char(30) DEFAULT NULL,       
          `pw` char(30) DEFAULT NULL,        
          `time` datetime DEFAULT NULL       
        ) ENGINE=InnoDB DEFAULT CHARSET=gbk 

 

目标:user表中有11条数据,使用数据库层分页技术,每次都按需取数据

 

 

分析:ecside展示数据的时候需要吧记录的list放到request中,讲记录的总数也放到request对象中,因此,我们只需要在页面上得到,当前的页码,用户选择的页面上记录显示的数目,在数据库层使用mysql的 limit 就可以构造出分页sql了

 

 

解决方案:(关键步骤)

 

a.使用 RequestUtil.getPageNo(request) 得到当前的页码

b.使用 RequestUtil.getCurrentRowsDisplayed(request) 得到 页面上显示的记录的数目

 

MYSql 的limit的用法:

 

在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

        LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15

//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.

//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5;     //检索前 5 个记录行

//换句话说,LIMIT n 等价于 LIMIT 0,n。

 

 

c. 使用 select * from user order by time desc limit 2,4 使用类似的sql得到分页记录,如果是oracle可以使用一个子查询,并使用rownum

 

d. 构造结果对象 ResultObject

 

package cn.com.xinli.bean;
import java.io.Serializable;
import java.util.ArrayList;
public class ResultObject implements Serializable
{
	/**
	 * 分页查询结果集对象
	 * count 不分页查询所有的结果集的数目(从数据库select count(1) from user)
	 * list 页面上需要显示的分页后的记录list
	 */
	
	int count;
	
	ArrayList list=new ArrayList ();

	public int getCount()
	{
		return count;
	}

	public void setCount(int count)
	{
		this.count = count;
	}

	public ArrayList getList()
	{
		return list;
	}

	public void setList(ArrayList list)
	{
		this.list = list;
	}
}

 

 

e.告诉ecside 总的记录数目,和需要展示的 数据的list

  request.setAttribute("totalRows",ro.getCount()); 
  request.setAttribute("recordList",ro.getList()); 

 

 

 

f. 在页面上 ectable 中使用 retrieveRowsCallback="limit" 代表分页机制是 数据库层分页

 

 

完整的实现见附件,你只需要

1.修改 conf.properties 中的数据库连接参数

2.建立一个user表

3.部署在tomcat中,访问 http://localhost:9090/ecside/test.jsp

 

效果:

 

 

 

你可能感兴趣的:(oracle,sql,tomcat,mysql,struts)