王朝网络
分享
 
 
 

java 简洁的分层实现

王朝学院·作者佚名  2016-05-28  
宽屏版  字体: |||超大  

java 简洁的分层实现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);

}

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

returncount

}

}

从代码中可以看出,当你执行使用了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<News> 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<News> getPageNewsList(int pageNo,int pageSize);

}

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

public class NewsDaoImple extends BaseDao implements NewsDao{

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

public List<News> getPageNewsList(int pageNo,int pageSize){

List<News> newslist=new ArrayList<News>();

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<News> 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());

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有