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

}

}

}

java 简洁的分层实现的更多相关文章

  1. 软件包 java.util 的分层结构

    概述  软件包  类  使用   树  已过时  索引  帮助  JavaTM Platform Standard Ed. 6  上一个   下一个 框架    无框架    所有类         ...

  2. 小学生之JAVA中的分层

    三层架构 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL). 区分层次的目的即为了“高内聚,低 ...

  3. java web中分层MVC的意义

    在web编程中,由于高内聚.低耦合的特点,需要将多个类实现多层,大致有以下几层:①entity,实体类,如user,role等,这些类里边包含了私有属性和公共的get.set方法这和数据库中的表相对应 ...

  4. java安全性-引用-分层-解耦

    Java不支持指针, 一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用 "特洛伊"木马等欺骗手段访问对象的私有成员 访问一个对象必须通过这个对象的引用 java ...

  5. java service domain dao 分层思路

    今天在开发项目的时候,对项目的java后台的分层有一些看法: 首先,鼓励使用service domain dao 层分层设计概念. 其次,对几层作用的理解: 第一:dao层操作单表,不涉及复杂逻辑,主 ...

  6. Web开发技术选型之Java与PHP

    PHP与J2EE的对比 网上有很多关于PHP与J2EE之间的对比,细观无非以下几点: 1.语言特征 PHP为脚本语言,解释型语言,弱类型,专为Web开发打造.Java为C语言系编程语言,编译型,强类型 ...

  7. JavaWeb开发中的分层思想(一)

    JavaWeb开发分层思想(一) 一.认识DAO.Service.Controller层 DAO(Data Access Object) 1.直接看英文意思就是"数据访问对象",也 ...

  8. JavaScript与java的异同(一)

    讲个故事:话说很久很久以前,有一个叫网景(Netscape)的,十月怀胎,他生了个儿子,很开兴,给儿子取名livescript.Livescript很勤奋,帮大叔大婶干了好多活,也给他爸赚了很多钱.突 ...

  9. Java 应用性能调优实践

    Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具和思路,给出搜狗商业平台的性 ...

随机推荐

  1. 伪基站,卒于5G——本质上是基于网络和UE辅助的伪基站检测,就是将相邻基站的CI、信号强度等信息通过测量报告上报给网络,网络结合网络拓扑、配置信息等相关数据,对所有数据进行综合分析,确认在某个区域中是否存在伪基站

    伪基站,卒于5G from:https://www.huxiu.com/article/251252.html?h_s=h8 2018-07-05 21:58收藏27评论6社交通讯     本文来自微 ...

  2. settings.xml配置文件详解

    简单值 一半顶层settings元素是简单值,它们表示的一系列值可以配置Maven的核心行为:settings.xml中的简单顶层元素 < settings xmlns="http:/ ...

  3. hdu 3032 Nim or not Nim? sg函数 难度:0

    Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. kvm虚拟主机安装速度很慢

    在c6220 II上部署虚拟化遇到的问题: 1.部署完kvm后,安装虚拟主机的过程非常缓慢,但是最终能成功 原因:宿主机BIOS的virtualization technology设置为Disable ...

  5. Prism 4 文档 ---第9章 松耦合组件之间通信

    当构建一个大而负责的应用程序时,通用的做法时将功能拆分到离散的模块程序集中.将模块之间的静态引用最小化.这使得模块可以被独立的开发,测试,部署和升级,以及它迫使松散耦合的沟通. 当在模块之间通信时,你 ...

  6. lombok --- 常用注解解析

    @Data@Getter @Setter @ToString@Cleanup@NonNull@Builder@EqualsAndHashCode      

  7. 记一次GreenPlum性能调优

    在部署了的GreenPlum集群中进行数据查询时,发现数据量一旦大了,查询一跑就中断,提示某个segment中断了连接. ERROR 58M01 "Error on receive from ...

  8. Android程序员学WEB前端(6)-CSS(1)-选择器-Sublime

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76576469 觉得博文有用,请点赞,请评论,请关注,谢谢!~ CSS外部文档链接: & ...

  9. iOS开发之如何应对苹果app的ipv6时代?

    WWDC2015苹果宣布在ios9支持纯IPv6的网络服务,并且要求2016年提交到app store的应用必须兼容纯IPv6的网络,要求适配的系统版本是ios9以上(包括ios9). 一 背景介绍 ...

  10. Chrome浏览器清除页面js文件缓存的方法

    Chrome浏览器清除页面js文件缓存 Chrome浏览器清除js缓存方法虽然简单,但有些人还是不太会,有些人会去设置里面清除有时候没有用,这里写一下简单步骤,使用一次以后就会了,而且速度更快 1.打 ...