• 分页功能的实现


    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>

  • 相关阅读:
    LostRoutes项目日志——玩家飞机精灵Fighter解析
    quartz Cron表达式一分钟教程
    vue-cli入门
    SQL中merge into用法
    SQLSERVER查询那个表里有数据
    C#实现复杂XML的序列化与反序列化
    MVC和WebApi 使用get和post 传递参数。
    项目管理软件推荐
    JS跨域请求
    Android动画效果translate、scale、alpha、rotate详解
  • 原文地址:https://www.cnblogs.com/97chen629/p/10767080.html
Copyright © 2020-2023  润新知