分页查询的实现原理
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>
演示效果如下所示:
还有很多需要完善的,所以先分享一下咯,继续努力咯!!!