oracle分页技术讲解
编写任务,数据库的数据量较大,一次获得了所有的用户,造成服务器的内存负担特别重,便对代码做了优化,采用了分页技术来分批获得用户的数据,减少对内存的负担。
笔者整理了如下几种分页技术:
1: hibernate分页技术(直接调用hibernate接口)
public List query(int pageSize,int currentPage,String queryHql){
return (List) getHibernateTemplate().executeWithNativeSession(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException, SQLException {//获取总数
Integer total = ((Long) queryCount.uniqueResult()).intValue();
Query query = session.createQuery(queryHql);
//计算第一个应该查询数据的位置(这里只是简单的描述,没有考虑当大于总数的情况)
int firstResult = pageSize * (currentPage - 1);
query.setFirstResult(firstResult); //设置查询的总数
query.setMaxResults(pageSize);
reuturn query.list();
}
}
}
2:jdbc分页技术
(1)jdbc查询第一种方案
查询总数:select count(*) as total from account;
设置分页大小:int pageSize=1000;
总共页数 int pages = total/pageSize;
是指分页查询语句:select accountid from (select accountid,rownum as rown from account where and rownum<=x ) c where c.rown>y ;(查询在y到x的数据)
执行体:
//
for(int i=0;i<=pages;i++){
min=i*pageSize;
if(i==pages)
max=total;
else
max=min+pageSize;
jdbcTemplate.queryForList(queryAccountSql,new Object[]{max,min})//查询语句 }
(2)jdbc查询第二种方案:
查询sql语句:
select accountid from (select accountid,rownum as rown from account ) c where c.rown between x and y;(其中x为min,第二个y为max);
第一种方案和第二种方案比较:
第一个查询效率比第二个查询效率高:第一种只需要内层查询只需要返回x 个结果,而第二种方案内层查询需要返回所有的查询结果。