分页查询的实现原理

1:接着上次写的图书管理系统:http://www.cnblogs.com/biehongli/p/6445803.html

这次新增了分页查询;



2:为什么会用到分页呢,因为列表内容太多了,所以使用分页进行显示。

分页的核心就是计算每页多少记录和总页数以及第几页。

3:首先先写如何计算每页多少记录和第几页,依旧在BookDao.java和BookDaoImpl.java中继续增加方法

在计算每页多少记录和第几页的后台核心代码如下所示:

  //第二步书写sql语句
     String sql="select * from book limit ?,? ";
     ps=con.prepareStatement(sql);//第三步:预编译
     //第几页需要设置好是页数减一乘以每页的记录数即是第多少页
     ps.setInt(1, (page-1)*record);
     ps.setInt(2, record);

1 /***
2      * 分页查询的方法
3      * @param page 第几页
4      * @param record 一页有多少记录
5      * @return
6      */
7     public List<Book> bookPage(int page,int record);
 1 @Override
 2     public List<Book> bookPage(int page, int record) {
 3         Connection con=null;
 4         PreparedStatement ps=null;
 5         ResultSet rs=null;
 6         try {
 7             con=BaseDao.getCon();//第一步连接数据库
 8             //第二步书写sql语句
 9             String sql="select * from book limit ?,? ";
10             ps=con.prepareStatement(sql);//第三步:预编译
11             //第几页需要设置好是页数减一乘以每页的记录数即是第多少页
12             ps.setInt(1, (page-1)*record);
13             ps.setInt(2, record);
14
15             //第四步执行sql
16             rs=ps.executeQuery();
17             List<Book> list=new ArrayList<Book>();
18             while(rs.next()){
19                 Book book=new Book();
20                 book.setBookid(rs.getInt("bookid"));
21                 book.setBookname(rs.getString("bookname"));
22                 book.setPrice(rs.getDouble("price"));
23                 book.setAuthor(rs.getString("author"));
24                 book.setPic(rs.getString("pic"));
25                 book.setPublish(rs.getString("publish"));
26
27                 list.add(book);
28             }
29             return list;
30         } catch (ClassNotFoundException e) {
31             e.printStackTrace();
32         } catch (SQLException e) {
33             e.printStackTrace();
34         }finally{
35             //关闭资源,避免出现异常
36             BaseDao.close(con, ps, rs);
37         }
38
39         return null;
40     }

4:首先先写如何计算总页数,依旧在BookDao.java和BookDaoImpl.java中继续增加方法

1 /***
2      * 获取总页数
3      * @param record
4      * @return
5      */
6     public int getCount(int record);
 1 @Override
 2     public int getCount(int record) {
 3         Connection con=null;
 4         PreparedStatement ps=null;
 5         ResultSet rs=null;
 6         //设置初始值为-1
 7         int n=-1;
 8         try {
 9             con=BaseDao.getCon();//第一步连接数据库
10             //第二步书写sql语句
11             String sql="select count(*) from book ";
12             ps=con.prepareStatement(sql);//第三步:预编译
13
14             //第四步执行sql
15             rs=ps.executeQuery();
16             if(rs.next()){
17                 //获取第一条记录,因为查询count(1)就一条记录,获取即可,即总记录数
18                 n=rs.getInt(1);
19                 //将总记录数除以每页的总记录数然乎向上取整即可
20                 n=(int)Math.ceil(1.0*n/record);
21             }
22
23         } catch (ClassNotFoundException e) {
24             e.printStackTrace();
25         } catch (SQLException e) {
26             e.printStackTrace();
27         }finally{
28             //关闭资源,避免出现异常
29             BaseDao.close(con, ps, rs);
30         }
31
32         return n;
33     }

5:接下来直接在book.jsp进行代码的开发,完成分页功能,本页的都是核心,因为在book.jsp页面完成了如何操作上一页,下一页,跳转页数,以及完成了首页尾页的控制

  1 <%@page import="com.bie.dao.impl.BookDaoImpl"%>
  2 <%@page import="com.bie.dao.BookDao"%>
  3 <%@ page language="java" contentType="text/html; charset=UTF-8"
  4     pageEncoding="UTF-8" %>
  5 <%@ page import="java.util.List" %>
  6 <%@ page import="com.bie.po.Book" %>
  7 <%@ page import="com.bie.service.impl.BookServiceImpl" %>
  8
  9 <%@ include file="head.jsp" %>
 10 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 11 <html>
 12 <head>
 13 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 14 <title>图书处理页面</title>
 15 <style type="text/css">
 16 h1{text-align:center;}
 17 </style>
 18
 19 <script type="text/javascript">
 20     function clickIt(){
 21         var p2=document.getElementById("t2").value;
 22         location.href="book.jsp?p="+p2;
 23     }
 24 </script>
 25 </head>
 26 <body>
 27 <%-- <%
 28     //第一次使用的方法
 29     Book book=new Book();
 30     BookServiceImpl service=new BookServiceImpl();
 31     List<Book> list=service.select(book);
 32 %> --%>
 33
 34 <%
 35     Book book=new Book();
 36     BookDao dao=new BookDaoImpl();
 37     //2:获取从下面上一页下一页传来的参数p
 38     String p2=request.getParameter("p");
 39
 40     //1:设置好第一页开始和一页有五条记录
 41     int p=1;
 42     int r=5;
 43     //5:获取到返回的总页数,将每页的总记录数传进去
 44     int count=dao.getCount(r);
 45
 46     //3:如果p2不为null且不为空,就转化为p
 47     if(p2!=null && !p2.equals("")){
 48         p=Integer.parseInt(p2);
 49     }
 50     //4:如果页数为负的那么就赋值为首页
 51     if(p<=0){
 52         p=1;
 53     }
 54
 55     //6:控制后面的页数,如果大于总页数,将最后一页赋值为尾页即可
 56     if(p>=count){
 57         p=count;
 58     }
 59
 60     //7:调用分页的方法进行分页操作
 61     List<Book> list=dao.bookPage(p, r);
 62
 63 %>
 64 <h1>图书列表</h1>
 65 <a href="javascript: window.history.go(-1)">返回上一级</a>
 66 <table align="center" cellpadding="10" cellspacing="10">
 67
 68     <tr bgcolor="green">
 69         <td>编号</td>
 70         <td>书名</td>
 71         <td>价格</td>
 72         <td>作者</td>
 73         <td>封皮</td>
 74         <td>出版社</td>
 75     </tr>
 76         <%-- <%
 77             for(Book b:list){
 78         %> --%>
 79         <%
 80             String bg="";
 81             for(int i=0;i<list.size();i++){
 82                 Book b=list.get(i);
 83                 if(i%2==0)
 84                     bg="pink";
 85                 else
 86                     bg="yellow";
 87         %>
 88     <tr bgcolor="<%=bg%>">
 89             <td><%=b.getBookid() %></td>
 90             <td><a href="doInfo.jsp?bookid=<%=b.getBookid() %>"><%=b.getBookname() %></a></td>
 91             <td><%=b.getPrice() %></td>
 92             <td><%=b.getAuthor() %></td>
 93             <td><%=b.getPic() %></td>
 94             <td><%=b.getPublish() %></td>
 95     </tr>
 96         <%
 97             }
 98         %>
 99 </table>
100 <div align="center">
101     第<%=p %>/共<%=count %>页
102     <a href="book.jsp?p=0">首页</a>
103     <a href="book.jsp?p=<%=p-1 %>">上一页</a>
104     <a href="book.jsp?p=<%=p+1 %>">下一页</a>
105     <a href="book.jsp?p=<%=count%>">尾页</a>
106     <input type="text" size="2" id="t2">
107     <input type="button" value="go" onclick="clickIt()"/>
108 </div>
109 </body>
110 </html>

演示效果如下所示:

还有很多需要完善的,所以先分享一下咯,继续努力咯!!!

时间: 2024-10-12 13:39:23

分页查询的实现原理的相关文章

Java技术积累——用最原始的代码见证分页查询实现原理

关于分页查询,大家并不陌生,easyui中封装的datagrid将表格的一系列操作运用的淋漓尽致,分页查询便是其中之一.然而,我们却疏于了解分页查询的基本实现原理,它究竟是如何实现的,今天就带大家一起来探个究竟! 看一下界面的实现效果: 看似很复杂的事情,其实实现它最核心的东西有两个: 一.实现分页查询的SQL语句 select user_id,user_name,password,contact_Tel,email,create_date from( select rownum rn,user

Mybatis最入门---分页查询(拦截器分页原理及实现)

[一步是咫尺,一步即天涯] 前文,我们演示了物理分页的Sql实现方式,这种方式使得我们每次在编写查询服务时,不断的重复造轮子.这样的代码实现方式就显得十分的笨拙了.本文是Mybatis分页查询的最后一片内容,我们将介绍基于拦截器的,精巧的实现方式.在阅读这篇文章之前,强烈建议各位看官能够先阅读上文.这样就能对下文我们提及的各种对象及他们之间的关系有一个清晰的关系.好了,废话不多讲,开始我们的正文部分吧. 准备工作: a.操作系统 :win7 x64 b.基本软件:MySQL,Mybatis,SQ

SQL--实现分页查询

      在查询数据中,对于某些数据量过大,为了减少页面上单页的加载时间,我们常常会选择分页查询,分页查询有很多方法,下面主要介绍两种分页方法.   一. 通过主键来实现分页: 1.数据库背景. Person表,ID主键盘,自增1,varchar行Name.    2.里面包含了10条数据. 3. 可以通过唯一ID,来进行分页. Note:SELECT TOP((@PageIndex-1)*@PageSize) ID FROM Person 查询出前面所有的数据的ID. 然后父查询,通过NOT

oracle count 百万级 分页查询记要总数、总条数优化

oracle count 百万级 分页查询记录总数.总条数优化 oracle count 百万级 查询记录总数.总条数优化 最近做一个项目时,做分页时,发现分页查询速度很慢,分页我做的是两次查询,一次是查询总数,一次是查询分页结果 /** 查询总记录数 **/ SELECT COUNT(id) FROM USER order by id /** 查询结果集 **/ select * from ( select row_.*, rownum rownum_ from ( select id , u

分页查询不知你是否真正的懂和PHP的正则的应用和一些性能优化

一.不废话太多  直接进入例子. 1  问题: 有一张收藏表,里面存储的是用户和图书ID.数据量为1亿.现在要求分页获取所有用户ID(不重复),写下你的sql语句. 表结构大致如下:           CREATE TABLE 收藏表(              `id` bigint(20) unsigned NOT NULL auto_increment COMMENT 'primary key',              `uid` bigint(20) unsigned NOT NU

基于Mysql数据库的SSM分页查询

前言: Hello,本Y又来了,"分页"在我们使用软件的过程中是一个很常见的场景,比如博客园对于每个博主的博客都进行了分页展示.可以简单清晰的展示数据,防止一下子将过多的数据展现给用户,毕竟用户的阅读能力和短期接受力都有限,使用分页可以避免带给用户浏览上的不舒服感,利用它可以带给用户良好的体验,便于浏览和查询数据.那么本期我们的博客就来探讨关于分页,使用的Java的框架是Spring+Springmvc+mybatis,这也是目前企业非常流行的搭配方式,使用的数据库是Mysql,我们将

myBatis学习笔记(10)——使用拦截器实现分页查询

1. Page package com.sm.model; import java.util.List; public class Page<T> { public static final int DEFAULT_PAGE_SIZE = 20; protected int pageNo = 1; // 当前页, 默觉得第1页 protected int pageSize = DEFAULT_PAGE_SIZE; // 每页记录数 protected long totalRecord = -1

Mybatis封装分页查询的java公用类

分页----对于数据量很大的查询中,是必不可少的.mybatis底层的分页sql语句由于需要我们自己去手动写.而实现分页显示的时候我们需要根据分页查询条件查询符合条件的总记录数和记录的详细情况.因此,若是不去实现封装一下的话,我们需要写两条SQL语句去实现它.一次用于查询记录数目.一次用于查询分页显示的详细记录.当项目中碰到很多需要分页的时候,我们便对于每一个Mapper.xml文件都需要去写两条SQL语句.极其麻烦,代码重用----必须重用.所以,一个公共方法的分页需求应运而生. 直接上分页公

框架 day50 BOS项目 4 批量导入(ocupload插件,pinyin4J)/POI解析Excel/Combobox下拉框/分区组合条件分页查询(ajax)/分区数据导出(Excel)

知识点: 批量导入(ocupload插件,pinyin4J /POI解析Excel(apache POI) /区域分页查询 /Combobox下拉框 /分区组合条件分页查询(ajax) /分区数据导出(Excel下载) BOS项目笔记第4天 1.    区域批量导入功能 *Ajax不支持文件上传. *上传并且不刷新上传页面原理: Target到一个0,0,0的隐藏iframe里,造成一个没有刷新的假象 <form target="myIframe" action="ab