一、新闻列表实现分页查询
1.1问题引入
如果不用分页的话,第一,在一个页面上显示很多新闻,客户体验极差;第二,对于数据库来说,一次性查询成千上万条新闻,要死啊?
有没有一种现实方式,既能显示多条信息,又不需要拖动页面呢?
可以使用分页查询来解决这个问题。
使用分页查询:
1、可以在不拖动页面的情况下显示多条信息
2、并且不是在数据库里面直接去查上万条数据,而是根据分页显示的数据的容量去数据库拿相应容量的数据。
1.2学习方法
先编写分页查询sql语句,再编写分页查询方法,将分页查询分步实现。(分页查询所依赖的核心就是sql语句)
二、后台
首先要知道新闻总条数(第一个方法),浏览器界面每页显示条数,总页数(第二个方法),去数据库中分页查询数据(第三个方法)。
并且这些方法都是写在NewsDao层,在NewsDaoImpl层中实现,在Service层调用。第一、三个方法写在NewsDao中,第二个方法写在一个工具类中(因为计算总页数在好多地方都有应用,比如评论分页等)。
2.1NewsDao里面的方法及其实现类
分页查询这个方法的sql语句如下:
#分页显示新闻数据,每页显示两条,这里显示第一页
SELECT id,title,author,createdate FROM news_detail LIMIT 0,2
#分页显示新闻数据,每页显示两条,这里显示第二页
SELECT id,title,author,createdate FROM news_detail LIMIT 2,2
#分页显示新闻数据,每页显示两条,这里显示第三页
SELECT id,title,author,createdate FROM news_detail LIMIT 4,2
#公用的分页sql
#第二个数:分页后每页显示几条新闻(页面容量) pageSize
#第一个数:从第几条数据开始显示(当前页码pageNo-1)*pageSize
SELECT id,title,author,createdate FROM news_detail
LIMIT (pageNo-1)*pageSize,pageSize
NewsDao里面的方法及其实现类:
// 查询新闻总数量
public int getTotalCount();
// 分页查询数据
public List<News> getPageNewsList(int pageNo, int pageSize);
// 查询新闻总数量
public int getTotalCount() {
int total = 0;
String sql = "SELECT COUNT(1) FROM news_detail";
Object[] params = {};
ResultSet rs = this.executeSQL(sql, params);
try {
while (rs.next()) {
total = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}
return total;
}
// 分页查询新闻数据:pageNo页面代码;pageSize是页面容量
public List<News> getPageNewsList(int pageNo, int pageSize) {
List<News> list = new ArrayList<News>();
String sql = "SELECT id,title,author,createdate FROM news_detail order by createdate desc LIMIT ?,?";
Object[] params = {(pageNo-1)*pageSize,pageSize};
ResultSet rs = this.executeSQL(sql, params);
try {
while (rs.next()) {
News news = new News();
int id = rs.getInt("id");
String newsTitle = rs.getString("title");
String author = rs.getString("author");
Timestamp createDate = rs.getTimestamp("createDate");
news.setId(id);
news.setTitle(newsTitle);
news.setAuthor(author);
news.setCreateDate(createDate);
list.add(news);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
2.2Service层的实现类和方法
代码如下:
// 查询新闻总数量
public int getTotalCount();
// 分页查询数据
public List<News> getPageNewsList(int pageNo, int pageSize);`
public int getTotalCount() {
return newsdao.getTotalCount();
}
public List<News> getPageNewsList(int pageNo, int pageSize) {
return newsdao.getPageNewsList(pageNo, pageSize);
}
2.3在util包中写第二个方法:在知道页面容量和新闻总数的情况下计算总页数
package cn.kgc.util;
// 分页工具类:计算总页数(新闻总条数/页面容量)
public class PageSupport {
// 当前页面
private int currentPageNo = 1;
// 新闻总数量
private int totalCount = 0;
// 页面容量
private int pageSize = 0;
// 总页数
private int totalPageCount = 0;
public int getCurrentPageNo() {
return currentPageNo;
}
public void setCurrentPageNo(int currentPageNo) {
if (currentPageNo > 0) {
this.currentPageNo = currentPageNo;
}
}
public int getTotalCount() {
return totalCount;
}
// 计算总页数的方法
public void setTotalPageCountByRS() {
if (this.totalCount % this.pageSize == 0) {
this.totalPageCount = this.totalCount / this.pageSize;
} else {
this.totalPageCount = this.totalCount / this.pageSize + 1;
}
}
// 总数量:设置总数量时,计算出来总页数
public void setTotalCount(int totalCount) {
if (totalCount >= 0) {
this.totalCount = totalCount;
// 设置总页数
this.setTotalPageCountByRS();
}
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
if (pageSize > 0) {
this.pageSize = pageSize;
}
}
public int getTotalPageCount() {
return totalPageCount;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
// 流程:首先去数据库查询新闻总数量—设置新闻总数量同时计算总页数
// —getTotalPageCount获得总页数
}
网友评论