java分层窗格_java 简洁的分层实现

本文详细介绍了数据库分页查询的两种主要方法及其优缺点,包括将所有数据存储在session对象中和利用SQL的count()函数计算总页数。在实现数据分页显示时,确定每页显示数量,计算总页数,并编写SQL语句,例如使用TOP关键字限制查询结果。同时,展示了如何通过Java代码实现分页查询,包括获取数据库记录总数,计算总页数,以及构造分页查询的SQL语句。
摘要由CSDN通过智能技术生成

1.分页实现

分页实现是将所有查询结果保存在session对象或集合中,翻页时从session对象或集合中取出一页所需的数据显示。但是这种方法有两个最主要的缺点:一是用户看到的可能是过期数据;二是如果数据量非常大,查询一次数据集会耗费很长时间,并且存储的数据也会占用大量内存,效果明显下降。

2.实现数据分页显示的步骤

(1)确定每页显示的数据数量。根据页面的设计,确定在数据列表中每次显示多少条记录,也就是说每次从数据库中需要查询出多少条记录用于页面显示,通常这个数量可以在开发时定义好,也可以通过用户来确定。

(2)计算显示的总页数。既然要进行分页显示,还需清楚按照每页显示的数据库记录数量,计算出需要划分的总页数。由于在页面中显示的记录数量是固定的,而数据库中共存储了多少条记录是未知的,因此要想得到总页数,需要以下步骤:

<1>首先要通过查询获取数据库中总的记录数,在SQL  Server 数据库中提供了count()聚合函数,借助count()聚合函数就可以获取数据库中记录的总数,代码如下所示:

定义新闻接口代码如下。

public interface NewsDao{

public   int  getTotalCount();

}

新闻接口的实现类中获取数据库中记录总数的代码如下。

public class NewsDaoIple extends BaseDao implements NewsDao{

public  int getTotalCount(){

int count =0;

String sql="select count(*)  fro News";

......//省略执行代码

if(rs.next()){

count=rs.getInt(1);

}

....//省略执行代码

return     count

}

}

从代码中可以看出,当你执行使用了count()函数的SQL语句后,将获得news表中的记录总数,然后将其数据返回。

<2>有了数据库记录总数后,就可以根据每页显示的记录数计算共需要划分为多少页,将有关分页的数据封装到page类,代码如下:

public  class  Page{

//总页数

private int totalPageCount=1;

//页面大小,即每页显示记录数

private int pageSize=0;

//记录总数

private  int totalCount=0;

//当前页码

private int currPageNo=1;

//每页新闻集合

List  newsList;

.........//省略其他getter/setter()方法

public  int  getCurrPageNo(){

if(totalPageCount==0)

return 0;

return currPageNo;

}

public  void  setCurrPageNo(int currPageNo){

if(this.currPageNo>0)

this.currPageNo = currPageNo;

}

public int getPageSize(){

return  pageSize;

}

public void  setPageSize(int pageSize){

if(pageSize>0)

this.pageSize = pageSize;

}

public  int  getTotalCount(){

return  totalCount;

}

public  void  setTotalCount(int totalCount){

if(totalCount>0){

this.totalCount = totalCount;

//计算总页数

totalPageCount=this.totalCount%pageSize==0?(this.totalCount/pageSize) : this.totalCount/pageSize+1;

}

}

}

以上代码设置记录总数的setTotalCount()方法中,根据记录总数和每页显示记录数通过公式计算出总页数,其使用了条件三元运算符 "? :" 的方式进行数据处理。如果记录总数能被每页显示记录数整除,则总页数为两者的商;如果不能被整除,则余出的记录数单独列为一页,所以总页数为两者的商再加一。

(3)编写SQL语句。

《1》假如每页显示3条记录,若要显示第一页的记录,则:

String  sql="select top 3  NID,NTITLE,NCREATEDATE  from News"+" where NID not in (select top 0 NID from News)";

上述语句中top作用是限制返回的行数,此语句运用了两层嵌套的查询方式,内层的select语句是一条普通的返回限制行的查询语句,他的执行结果实际上是为外层的select语句起到一个限制范围的作用,其中数字0是起始行的下标,如显示第一页则从第一行开始查询,即起始下标为0.而外层的select语句限制的行数实际上是每页要显示的记录数,其执行结果就是从内层语句的查询结果中按照起始行的下标取出前三条(每页显示的记录数)。

起始行的下标 = (当前页页码-1)* 每页显示的数据量

《2》String sql="select top "+pageSize+" NID,NTITLE,NCREATEDATE  from News"+"where NID not in(select  top  "+(currPageNo-1)* pageSize+"NID  from News )";

pageSize 表示每页显示的记录数,而currPageNo 变量表示当前页的代码。

定义新闻接口的代码如下:

public interface NewsDao{

public int getTotalCount();

public List getPageNewsList(int pageNo,int pageSize);

}

新闻接口的实现类中获得每页新闻集合代码如下:

public class NewsDaoImple extends BaseDao implements  NewsDao{

.....//省略查询数据库中记录总数的代码

public List getPageNewsList(int pageNo,int pageSize){

List  newslist=new ArrayList();

Connection con=this.getConnection();

PreparedStatement  ps=null;

ResultSet  rs=null;

String  sql="select top "+pageSize+"NID,NTITLE,NCREATEDATE  from News where NID not in "+"(select top "+(pageNo-1)*pageSize+"NID from News"+"order by NCREATEDATE desc) order by NCREATEDATE desc";

.......//省略其他执行代码

return  newslist;

}

}

向页面显示信息:

public  class  NewsDAoImple extends BaseDao implements NewsDao{

..........//省略其他代码实现

public  static  void main(String[] args){

NewsDaoImple  news =new  NewsDaoImple ();

int  totalCount=news.getTotalCount();

Page  page =new Page();

page.setCurrPageNo(1);       //设置当前页面

page.setPageSize(3);        //设置每页条数

page.setTotalCount(totalCount);    //设置总数量

System.out.println("新闻总数量是:"+page.getTotalCount());

System.out.println("每页条数是:" + page.setPageSize(););

System.out.println("总页数:"page.getTotalPageCount());

System.out.println("当前是第"+ page.getCurrPageNo()"页");

List  newslist=news.getPageNewsList(page.getCurrPageNo(), page.getPageSize());

page.setListNews(newslist);

for(News news:page.getListNews()){

System.out.println(news.getNid()+"\t"+news.getNtitle()+"\t"+news.getNcreatedate());

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值