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);
}
....//省略执行代码
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 简洁的分层实现的更多相关文章
- 软件包 java.util 的分层结构
概述 软件包 类 使用 树 已过时 索引 帮助 JavaTM Platform Standard Ed. 6 上一个 下一个 框架 无框架 所有类 ...
- 小学生之JAVA中的分层
三层架构 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL). 区分层次的目的即为了“高内聚,低 ...
- java web中分层MVC的意义
在web编程中,由于高内聚.低耦合的特点,需要将多个类实现多层,大致有以下几层:①entity,实体类,如user,role等,这些类里边包含了私有属性和公共的get.set方法这和数据库中的表相对应 ...
- java安全性-引用-分层-解耦
Java不支持指针, 一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用 "特洛伊"木马等欺骗手段访问对象的私有成员 访问一个对象必须通过这个对象的引用 java ...
- java service domain dao 分层思路
今天在开发项目的时候,对项目的java后台的分层有一些看法: 首先,鼓励使用service domain dao 层分层设计概念. 其次,对几层作用的理解: 第一:dao层操作单表,不涉及复杂逻辑,主 ...
- Web开发技术选型之Java与PHP
PHP与J2EE的对比 网上有很多关于PHP与J2EE之间的对比,细观无非以下几点: 1.语言特征 PHP为脚本语言,解释型语言,弱类型,专为Web开发打造.Java为C语言系编程语言,编译型,强类型 ...
- JavaWeb开发中的分层思想(一)
JavaWeb开发分层思想(一) 一.认识DAO.Service.Controller层 DAO(Data Access Object) 1.直接看英文意思就是"数据访问对象",也 ...
- JavaScript与java的异同(一)
讲个故事:话说很久很久以前,有一个叫网景(Netscape)的,十月怀胎,他生了个儿子,很开兴,给儿子取名livescript.Livescript很勤奋,帮大叔大婶干了好多活,也给他爸赚了很多钱.突 ...
- Java 应用性能调优实践
Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具和思路,给出搜狗商业平台的性 ...
随机推荐
- PyCharm在win10的64位系统安装实例
搭建环境 1.win10_X64,其他Win版本也可以. 2.PyCharm版本:Professional-2016.2.3. 搭建准备 1.到PyCharm官网下载PyCharm安装包. 2.选择W ...
- java反射调用api
cglib的fastmethod 简单示例: FastClass serviceFastClass = FastClass.create(Person.class); Person p = new P ...
- 重温MVC基础入门
重温MVC基础入门 简介 本文主要是作者回顾MVC基础的文章,整合个人认为基础且重点的信息,通过简单实践进行复习. 相关代码地址:https://github.com/OtherRuan/Revi ...
- form表单注册——HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- django中如何将多个app归到一个目录下。
1.当startapps 生成多个app后,为了便于管理,可新建一个apps目录,把应用全部剪切进apps. 如果是在pycharm中,会提示是否自动更新路径,这里要全部选择取消. QQ群交流:697 ...
- 【css】25个漂亮的响应式布局的web设计【转】
响应的web设计的做法是提高用户的浏览质量,并在不同设备上能够完美的浏览使用,就像大前端推出的D7主题.看看下面美丽的响应的网站布局,通过本文你会在以后的设计中找到响应的web设计的灵感. 1.Mar ...
- 在创建一个MVC控制器,显示运行所选代码生成器时出错(带读写,使用EF)
在创建一个MVC控制器,在Controllers文件夹选择添加->控制器,如下图: 显示运行所选代码生成器时出错 解决方法: 第一步:Install-Package Microsoft.aspn ...
- CMD命令提示符下选中文字即可以复制和SecureCRT一样
用过 SecureCRT 的都会觉得复制粘贴很方便.只要选中相应文字,会自动复制.然后点鼠标右键就可以粘贴,非常方便. 但是在windows系统下的CMD里面,每次都要点鼠标右键→标记,再选中相应文字 ...
- JDBC的步骤
使用jdbc步骤 a.导入数据库厂商提供的驱动程序(导入jar包) b.加载驱动程序 Class.forName("驱动程序类") c.获得连接 Connection conn=D ...
- Linux运维-Rsync+Inotify
Rsync+Inotify Rsync:linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步. 特性: 可 ...