zoukankan      html  css  js  c++  java
  • Java基础94 分页查询(以MySQL数据库为例,Servlet技术)

    1、概述      

      分页查询,也可叫做分批查询,基于数据库的分页语句(不同数据库是不同的)。
      本文使用的事MySql数据库。
           假设:每页显示10条数据.
           Select * from contact  limit M,N;
           M:开始记录的索引。第一条数据的索引为0 (页数)
           N:一次查询几条记录(每页显示的数据的条数)
               则:
                 第一页:select * from contact limit 0,10;
                 第二页:select * from contact limit 10,10
                 ............
                 第n页:select * from contact limit(M-1)*N,N;

    在MySQL数据库中的分页查询操作https://www.cnblogs.com/dshore123/p/10544241.html

    2、实例演示  

    db.properties 配置文件

    1 url=jdbc:mysql://localhost:3306/school
    2 user=root
    3 password=123456
    4 driverClass=com.mysql.jdbc.Driver

    JdbcUtil.java 封装文件(连接数据库)

     1 package com.shore.util;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.FileNotFoundException;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.sql.Connection;
     8 import java.sql.DriverManager;
     9 import java.sql.ResultSet;
    10 import java.sql.SQLException;
    11 import java.sql.Statement;
    12 import java.util.Properties;
    13 
    14 public class JdbcUtil {
    15     //连接数据库的URL
    16     private static String url=null;
    17     private static String user=null;//用户名
    18     private static String password=null;//密码
    19     private static String driverClass=null;
    20     //静态代码块中(只加载一次)
    21     static{
    22         try {
    23             //读取db.properties
    24             Properties props=new Properties();
    25             InputStream in=JdbcUtil.class.getResourceAsStream("/db.properties");
    26             //加载文件
    27             props.load(in);
    28             url=props.getProperty("url");
    29             user=props.getProperty("user");
    30             password=props.getProperty("password");
    31             driverClass=props.getProperty("driverClass");
    32             //注册驱动
    33             Class.forName(driverClass);
    34         } catch (FileNotFoundException e) {
    35             e.printStackTrace();
    36         } catch (IOException e) {
    37             e.printStackTrace();
    38         } catch (ClassNotFoundException e) {
    39             e.printStackTrace();
    40             System.out.println("注册驱动失败");
    41         }
    42     }
    43     /*
    44       * 获取连接
    45       * */
    46     public static Connection getConnection(){
    47         try {
    48             Connection conn=DriverManager.getConnection(url, user, password);
    49             return conn;
    50         } catch (SQLException e) {
    51             e.printStackTrace();
    52             throw new RuntimeException();
    53         }
    54     }
    55      /*
    56       * 释放资源
    57       * */
    58     public static void close(Connection conn,Statement stmt,ResultSet rs){
    59         try {
    60             if(stmt!=null) stmt.close();
    61             if(conn!=null) conn.close();
    62             if(rs!=null) rs.close();
    63         } catch (SQLException e) {
    64             e.printStackTrace();
    65         }
    66     }
    67 }

    Page 实体类

      1 package com.shore.entity;
      2 
      3 import java.util.List;
      4 
      5 //封装与分页有关的所有信息
      6 public class Page {
      7     private List records;//要显示的分页记录
      8     private int currentPageNum;//当前页码;可由用户指定(用于输入页码,点击跳转到指定页)*
      9     private int pageSize = 10;//每页显示的记录条数(这里是没页显示10条数据) *
     10     private int totalPageNum;//总页数*
     11     private int prePageNum;//上一页的页码*
     12     private int nextPageNum;//下一页的页码*
     13     
     14     private int startIndex;//数据库每页开始记录的索引(比如第2页是从11开始,第三页从21开始...)*
     15     private int totalRecords;//总记录的条数*
     16     //扩展的
     17     private int startPage;//开始页码
     18     private int endPage;//结束页码
     19 
     20     private String url;//查询分页的请求servlet的地址
     21     
     22     //currentPageNum:用户要看的页码
     23     //totalRecords:总记录条数
     24     public Page(int currentPageNum,int totalRecords){
     25         this.currentPageNum = currentPageNum;
     26         this.totalRecords = totalRecords;
     27         //计算总页数
     28         totalPageNum = totalRecords%pageSize==0?totalRecords/pageSize:(totalRecords/pageSize+1);
     29         //计算每页开始的索引
     30         startIndex = (currentPageNum-1)*pageSize;
     31         //计算开始和结束页码:9个页码
     32         if(totalPageNum > 9){
     33             //超过9页
     34             startPage = currentPageNum - 4;
     35             endPage = currentPageNum + 4;
     36             if(startPage < 1){
     37                 startPage = 1;
     38                 endPage = 9;
     39             }
     40             if(endPage>totalPageNum){
     41                 endPage = totalPageNum;
     42                 startPage = endPage - 8;
     43             }            
     44         }else{
     45             //没有9页
     46             startPage = 1;
     47             endPage = totalPageNum;
     48         }
     49     }
     50     public List getRecords() {
     51         return records;
     52     }
     53     public void setRecords(List records) {
     54         this.records = records;
     55     }
     56     public int getCurrentPageNum() {
     57         return currentPageNum;
     58     }
     59     public void setCurrentPageNum(int currentPageNum) {
     60         this.currentPageNum = currentPageNum;
     61     }
     62     public int getPageSize() {
     63         return pageSize;
     64     }
     65     public void setPageSize(int pageSize) {
     66         this.pageSize = pageSize;
     67     }
     68     public int getTotalPageNum() {
     69         return totalPageNum;
     70     }
     71     public void setTotalPageNum(int totalPageNum) {
     72         this.totalPageNum = totalPageNum;
     73     }
     74     //不能无限上一页(假如当前页是第1页,那么“上一页”这个按钮变为灰色,再点击,则 无反应)
     75     public int getPrePageNum() {
     76         prePageNum = currentPageNum-1;
     77         if(prePageNum < 1){
     78             prePageNum = 1;
     79         }
     80         return prePageNum;
     81     }
     82     public void setPrePageNum(int prePageNum) {
     83         this.prePageNum = prePageNum;
     84     }
     85     //不能无限下一页(假如当前页是最后一页,那么“下一页”这个按钮变为灰色,再点击,则 无反应)
     86     public int getNextPageNum() {
     87         nextPageNum = currentPageNum + 1;
     88         if(nextPageNum > totalPageNum){
     89         if(nextPageNum > totalPageNum){
     90             nextPageNum = totalPageNum;
     91         }
     92         return nextPageNum;
     93     }
     94     public void setNextPageNum(int nextPageNum) {
     95         this.nextPageNum = nextPageNum;
     96     }
     97     public int getStartIndex() {
     98         return startIndex;
     99     }
    100     public void setStartIndex(int startIndex) {
    101         this.startIndex = startIndex;
    102     }
    103     public int getTotalRecords() {
    104         return totalRecords;
    105     }
    106     public void setTotalRecords(int totalRecords) {
    107         this.totalRecords = totalRecords;
    108     }
    109     public int getStartPage() {
    110         return startPage;
    111     }
    112     public void setStartPage(int startPage) {
    113         this.startPage = startPage;
    114     }
    115     public int getEndPage() {
    116         return endPage;
    117     }
    118     public void setEndPage(int endPage) {
    119         this.endPage = endPage;
    120     }
    121     public String getUrl() {
    122         return url;
    123     }
    124     public void setUrl(String url) {
    125         this.url = url;
    126     }    
    127 }

    ContactDAOMySqlImpl 实现类

     1 package com.shore.dao.impl;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 import java.util.ArrayList;
     7 import java.util.List;
     8 
     9 import com.shore.dao.ContactDAO;
    10 import com.shore.entity.Contact;
    11 import com.shore.util.JdbcUtil;
    12 
    13 public class ContactDAOMySqlImpl implements ContactDAO{
    14 
    15     //总记录数
    16     public int getTotalRecordsNum() {
    17         Connection conn = null;
    18         PreparedStatement stmt = null;
    19         ResultSet rs = null;
    20         try{
    21             //获取数据库的连接
    22             conn = JdbcUtil.getConnection();
    23             //准备sql
    24             String sql = "select count(*) from contact";
    25             //执行预编译的sql语句(检查语法)
    26             stmt = conn.prepareStatement(sql);
    27             //执行sql语句
    28             rs = stmt.executeQuery();
    29             if(rs.next()){//把查到的结果返回给调用者
    30                 return rs.getInt(1);
    31             }
    32             return 0;
    33         }catch(Exception e){
    34             throw new RuntimeException(e);
    35         }finally{//关闭资源
    36             JdbcUtil.close(conn, stmt, rs);
    37         }
    38     }
    39     
    40     //每页的记录数
    41     public List<Contact> getPageRecords(int startIndex, int offset) {
    42         Connection conn = null;
    43         PreparedStatement stmt = null;
    44         ResultSet rs = null;
    45         try{
    46             //获取数据库的连接
    47             conn = JdbcUtil.getConnection();
    48             //执行预编译的sql语句(检查语法)
    49             stmt = conn.prepareStatement("select * from contact limit ?,?");
    50             //设置参数
    51             stmt.setInt(1, startIndex);
    52             stmt.setInt(2, offset);
    53             //发送参数,执行sql
    54             rs = stmt.executeQuery();
    55             List<Contact> cs = new ArrayList<Contact>();
    56             while(rs.next()){
    57                 Contact c=new Contact();
    58                 c.setId(rs.getString("id"));
    59                 c.setName(rs.getString("name"));
    60                 c.setSex(rs.getString("sex"));
    61                 c.setAge(rs.getInt("age"));
    62                 c.setPhone(rs.getString("phone"));
    63                 c.setEmail(rs.getString("email"));
    64                 c.setQq(rs.getString("qq"));
    65                 cs.add(c);
    66             }
    67             return cs;
    68         }catch(Exception e){
    69             throw new RuntimeException(e);
    70         }finally{//关闭资源
    71             JdbcUtil.close(conn, stmt, rs);
    72         }
    73     }
    74 }

    ContactServiceimpl 实现类

     1 package com.shore.service.impl;
     2 
     3 import java.util.List;
     4 
     5 import com.shore.dao.ContactDAO;
     6 import com.shore.dao.impl.ContactDAOMySqlImpl;
     7 import com.shore.entity.Page;
     8 import com.shore.service.ContactService;
     9 
    10 public class ContactServiceimpl implements ContactService{
    11     ContactDAO dao=new ContactDAOMySqlImpl();
    12 
    13     public Page findPage(String pageNum) {
    14         int num = 1;//用户要看的页码,默认是1
    15         if(pageNum!=null&&!pageNum.trim().equals("")){//解析用户要看的页码
    16             num = Integer.parseInt(pageNum);
    17         }
    18         int totalRecords = dao.getTotalRecordsNum();//得到总记录的条数
    19         Page page = new Page(num, totalRecords);//对象创建出来后,很多的参数就已经计算完毕
    20         //查询分页的记录(当前页显示的记录)
    21         List records = dao.getPageRecords(page.getStartIndex(), page.getPageSize());
    22         page.setRecords(records);
    23         return page;
    24     }
    25 }

    ListContactServlet 类

     1 package com.shore.servlet;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 
    10 import com.shore.entity.Page;
    11 import com.shore.service.ContactService;
    12 import com.shore.service.impl.ContactServiceimpl;
    13 
    14 public class ListContactServlet extends HttpServlet {
    15     /*
    16      * 显示所有联系人的逻辑
    17      * */
    18     public void doGet(HttpServletRequest request, HttpServletResponse response)
    19             throws ServletException, IOException {
    20         ContactService service=new ContactServiceimpl();
    21         String num=request.getParameter("num");
    22         Page page=service.findPage(num);
    23         page.setUrl("/ListContactServlet");
    24         request.setAttribute("page",page);
    25         request.getRequestDispatcher("/listContact.jsp").forward(request, response);
    26     }
    27 
    28     public void doPost(HttpServletRequest request, HttpServletResponse response)
    29             throws ServletException, IOException {
    30         doGet(request, response);    
    31     }
    32 }

    listContact.jsp 查询页面

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     4 <html xmlns="http://www.w3.org/1999/xhtml">
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     7 <title>查询所有联系人</title>
     8 <style type="text/css">
     9     table td{
    10         /*文字居中*/
    11         text-align:center;
    12     }
    13     
    14     /*合并表格的边框*/
    15     table{
    16         border-collapse:collapse;
    17     }
    18 </style>
    19 </head>
    20 
    21 <body>
    22 <center><h3>查询所有联系人</h3></center>
    23 <table align="center" border="1" width="700px">
    24     <tr>
    25         <th>编号</th>
    26         <th>姓名</th>
    27         <th>性别</th>
    28         <th>年龄</th>
    29         <th>电话</th>
    30         <th>邮箱</th>
    31         <th>QQ</th>
    32         <th>操作</th>
    33     </tr>
    34     <c:forEach items="${page.records}" var="con" varStatus="varSta">
    35     <tr>
    36         <td>${varSta.count }</td>
    37         <td>${con.name }</td>
    38         <td>${con.sex }</td>
    39         <td>${con.age }</td>
    40         <td>${con.phone }</td>
    41         <td>${con.email }</td>
    42         <td>${con.qq }</td>
    43         <td><a href="${pageContext.request.contextPath }/QueryContactServlet?id=${con.id}">修改</a>&nbsp;<a href="${pageContext.request.contextPath }/DeleteContactServlet?id=${con.id}">删除</a></td>
    44     </tr>
    45     </c:forEach>
    46     <tr>
    47         <td colspan="8" align="center"><a href="${pageContext.request.contextPath }/addContact.jsp">[添加联系人]</a></td>
    48     </tr>
    49 </table>
    50 <%@include file="/common/page.jsp"%>
    51 </body>
    52 </html>

    page.jsp 被包含的页面

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <!-- 分页显示:开始 -->
     3       
     4       第${page.currentPageNum }页/共${page.totalPageNum }页&nbsp;&nbsp;
     5       <a href="${pageContext.request.contextPath}/ListContactServlet?num=1">首页</a>
     6       <a href="${pageContext.request.contextPath}/ListContactServlet?num=${page.prePageNum}">上一页</a>
     7       
     8       <c:forEach begin="${page.startPage}" end="${page.endPage}" var="num">
     9           <a href="${pageContext.request.contextPath}/ListContactServlet?num=${num}">${num}</a>
    10       </c:forEach>
    11       
    12       <a href="${pageContext.request.contextPath}/ListContactServlet?num=${page.nextPageNum}">下一页</a>
    13       <a href="${pageContext.request.contextPath}/ListContactServlet?num=${page.totalPageNum }">尾页</a>
    14       
    15       &nbsp;&nbsp;
    16       <input type="button" id="bt1" value="跳转到" onclick="jump()"/>&nbsp;<input type="text" size="3" id="num" name="num" />
    17       &nbsp;&nbsp;
    18       <select name="selNum" onchange="jump1(this)">
    19           <c:forEach begin="1" end="${page.totalPageNum }" var="num">
    20               <option value="${num}" ${page.currentPageNum==num?'selected="selected"':'' } >${num}</option>
    21           </c:forEach>
    22       </select>
    23       
    24       <script type="text/javascript">
    25           function jump(){
    26               var numValue = document.getElementById("num").value;
    27               //验证
    28               if(!/^[1-9][0-9]*$/.test(numValue)){//验证是否是自然整数
    29                   alert("请输入正确的页码");
    30                   return;
    31               }
    32               if(numValue>${page.totalPageNum}){
    33                   alert("页码不能超过最大页数");
    34                   return;
    35               }
    36               window.location.href="${pageContext.request.contextPath}/ListContactServlet?num="+numValue;
    37           }
    38         
    39           function jump1(selectObj){
    40               window.location.href="${pageContext.request.contextPath}/ListContactServlet?num="+selectObj.value;
    41           }
    42       </script>
    43       
    44       <!-- 分页显示:结束 -->

    最终效果图:

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:https://www.cnblogs.com/dshore123/p/10597898.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    iOS TTF文件改变字体
    iOS CoreAnimation 核心动画
    iOS no visible @interface for 'UIButton' declares the selector errors
    iOS 如何通过CocoaPods添加第三方框架
    iOS AVAudioPlayer播放音乐
    iOS 一些常用代码的总结
    iOS 基础
    qworker 实例
    delphi RTTI 反射技术
    delphi IOUtils单元 处理文件路径相关
  • 原文地址:https://www.cnblogs.com/dshore123/p/10597898.html
Copyright © 2011-2022 走看看