分页功能的实现

1.分页sql语句

要实现 分页必须要知道某一页的数据 从哪里开始到哪里结束

假设每页显示10条数据

sql server/oracle:从1开始计数      

第n页         开始                           结束

1                 1                                10

2                 11                               20

3                 21                               30

n               (n-1)*10+1               n*10

(页数-1)*页面大小+1 ------------页数*页面大小

oracle的分页查询语句

 select  *from(

                select rownum r, t.  *from

                  (select s.*from student s order by sno asc) t

)

where r>=(n-1)*10+1  and  r< n*10

sql server2003的分页查询语句:top  ---此种分页sql存在弊端(如果id值不连续,则不能保证每页数据量相等)

select top 页面大小 *from student where id not in

(select top (页数-1)*页面大小 id from student order by sno asc)

sql server2012之后支持的:offset fetch next  rows only

select * from student  offset   (页数-1)*页面大小+1 fetch next  页面大小 rows only

mysql:从0开始计数

0                 0                                9

1                10                              19

2                20                              29

n                n*10                           (n+1)*10+1

mysql实现分页的sql

limit    从多少开始,每页显示多少条

第0页

select *from student  limit 0,10

第1页

select *from student  limit 10,10

第2页

select *from student  limit 20,10

第n页

select *from student  limit n*10,10

总结:select *from student  limit 页数*页面大小,页面大小

2.分页要实现5个变量(属性)

1.数据总数          100     103                        (查数据库:select count(1)..)

2.页面大小(每页显示的数据条数)  20     (用户自定义)

3.总页数                                                      (程序自动计算)

总页数=100/20=数据总数/页面大小

总页数=103/20+1=数据总数/页面大小+1

总结:总页数=数据总数%页面大小==0?数据总数/页面大小:数据总数/页面大小+1

4.当前页(页码)                                        (用户自定义)

5.当前页的对象集合(实体类集合):每页所显示的所有数据(20个人的信息)

List<Student>                                                (查数据库,写分页sql)

如我将我的课程信息进行分页  ,数据库用的是mysql

1.首先编写一个工具类page

package cn.qst.vo;

import java.util.List;

public class Page {
//当前页currentPage
private int currentPage;
//页面大小pageSize
private int pageSize;
//总数据totalCount
private int totalCount;
//总页数totalPage
private int totalPage;
//当前页数的集合
private List<Course> course;

public Page(int currentPage, int pageSize, int totalCount, int totalPage, List<Course> course) {
super();
this.currentPage = currentPage;
this.pageSize = pageSize;
this.totalCount = totalCount;
this.totalPage = totalPage;
this.course = course;
}
public Page() {
super();
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
/**
* 总页数=数据总数/页面大小==0?数据总数/页面大小:数据总数/页面大小+1
* 当我们调换用了数据总数的set()和页面大小的set()以后,自动计算出总页数
* 务必注意顺序:先set数据总数,在set页面大小
*/
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
//自动计算出总页数
//总页数=数据总数/页面大小==0?数据总数/页面大小:数据总数/页面大小+1
this.totalPage=this.totalCount%this.pageSize==0?this.totalCount/this.pageSize:this.totalCount/this.pageSize+1;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
//给总页数赋值
//public void setTotalPage(int totalPage) {
// this.totalPage = totalPage;
//}
public List<Course> getCourse() {
return course;
}
public void setCourse(List<Course> course) {
this.course = course;
}
@Override
public String toString() {
return "Page [currentPage=" + currentPage + ", pageSize=" + pageSize + ", totalCount=" + totalCount
+ ", totalPage=" + totalPage + ", course=" + course + "]";
}
}

2.dao中编写方法

//查询总数数据
public int getTotalCount();
//currentPage当前页(页码),pageSize页面大小(每页显示的数据条数)
public List<Course> queryCourseByPage(int currentPage,int pageSize);

3.daoImpl中实现该方法

@Override
public int getTotalCount() {//查询总数据量
int count=-1;
String sql="select count(1) from course";
conn=super.getConnection();
try {
pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
if(rs.next()){
count=rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
super.closeAll(conn, pstmt, stmt, rs);
}

return count;
}
@Override
//查询当前页的数据集合
public List<Course> queryCourseByPage(int currentPage, int pageSize) {
List<Course> list=new ArrayList<Course>();
Course course=null;
String sql="select *from course limit ?,?";
conn=super.getConnection();
try {
pstmt=conn.prepareStatement(sql);
pstmt.setInt(1, currentPage*pageSize);
pstmt.setInt(2, pageSize);
rs=pstmt.executeQuery();
while(rs.next()){
course=new Course();
course.setC_id(rs.getInt("c_id"));
course.setC_name(rs.getString("c_name"));
course.setC_detail(rs.getString("c_detail"));
course.setC_picture(rs.getString("c_picture"));
course.setC_teacher(rs.getString("c_teacher"));
list.add(course);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
super.closeAll(conn, pstmt, stmt, rs);
}
return list;
}

4.service中

public int getTotalCount();
public List<Course> queryCourseByPage(int currentPage,int pageSize);

5.serviceImpl中

@Override
public int getTotalCount() {
return courseDao.getTotalCount();
}
@Override
public List<Course> queryCourseByPage(int currentPage, int pageSize) {
return courseDao.queryCourseByPage(currentPage, pageSize);
}

6.servlet中

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int count=courseservice.getTotalCount();//总数据
//将分页所需的5个字段(其中有1个自动计算,因此实际只需要组装4个即可),组装到page
Page page=new Page();
String cpage=request.getParameter("currentPage");
//第一次进来为null,给一个初值。其他该是第几页就是第几页
if(cpage==null){
cpage="0";
}
int currentPage=Integer.parseInt(cpage);
page.setCurrentPage(currentPage);
//必须要先计算总数据数,在计算页面大小(即page.setTotalCount(count)与page.setPageSize(pageSize)顺序不能颠倒)
page.setTotalCount(count);
int pageSize=8;
page.setPageSize(pageSize);
List<Course> course=courseservice.queryCourseByPage(currentPage, pageSize);
page.setCourse(course);
request.setAttribute("list_course", course);
request.setAttribute("p", page);
request.getRequestDispatcher("displayCourse.jsp").forward(request, response);
}

7.displayCourse.jsp

<%@page import="cn.qst.vo.Page"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery-1.11.3.min.js"></script>
<title>显示课程信息</title>
</head>
<body>
<%
//获取request中数据
Page p =(Page)request.getAttribute("p");
%>
<table border="0"cellspacing="0" cellpadding="0">
<tr>
<td style="50px;text-align: center">序号</td>
<td style="100px;text-align: center">课程名</td>
<td style="text-align: center">课程讲述</td>
<td style="text-align: center">封面图片</td>
<td style="100px;text-align: center">课程讲师</td>
<td style="100px;text-align: center">相关视频</td>
</tr>


<c:forEach items="${list_course}" var="course" varStatus="i">
<tr style="background:#7FFFD4">
<td style="50px;text-align: center">${i.count} </td>
<td style="100px;text-align: center">${course.c_name}</td>
<td style="text-align: center"><font style="font-size:12px;">${course.c_detail}</font></td>
<td style="text-align: center"><img width="100px" height="50px" src="upload/${course.c_picture}"/></td>
<td style="100px;text-align: center">${course.c_teacher}</td>
<td style="text-align: center">
<a href="CheckVideoServlet?method=checkvideo&c_id=${course.c_id}" target="middle" style="text-decoration:none">查看</a>
|<a href="CourseServlet?method=deleteCourse&c_id=${course.c_id}" target="middle" style="text-decoration:none">删除</a>
</td>
</tr>
</c:forEach>
</table>
<div style="text-align: center">
<a href="CourseServlet?currentPage=0">首页</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="CourseServlet?currentPage=<%=p.getCurrentPage()-1%>">上一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="CourseServlet?currentPage=<%=p.getCurrentPage()+1%>">下一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="CourseServlet?currentPage=<%=p.getTotalPage()-1%>">尾页</a>
</div>
</body>
</html>

原文地址:https://www.cnblogs.com/97chen629/p/10767080.html