Mysql学习总结(32)——MySQL分页技术详解
1.什么是数据分页:数据分页就是将很多条记录像书本一样分页,每页显示多少行记录;
2.为什么要数据分页:当我们进行sql语句查询时,假如数据有成千上万行记录,如果在同一个页面去显示,那这个页面得有多大,数据就要很多,而我们所需的记录又很少,不使用分页,查看起来那么繁琐,而且一不小心容易看着眼花。使用数据分页,就行书本一样,有页数,一目了然。相当简洁。
3.核心sql语句:SELECT * FROM stud LIMIT m,n ————m表示要显示的页数,n表示显示的记录行数
4.核心思想:
- 总行数(rows): select count(1) from stud;
- 每页显示的行数(PAGE_SIZE): 固定值---已知的一个常量
- 页数: pageSize= num/n + (num%n==0)?0:1
- 当前页号: currentPage
- 当前要显示的页面数据的起始行号和终止行号 :startRow: (currentPage-1)*pageSize
- 如何显示从startN开始的pageSize条记录 select * from stud limit startN, pageSize;
- 当前显示的开始页号:showStart=currentPage-showSize/2;
- 当前显示的结束页号:showEnd=showStart+showSize-1;
- 模糊查询:select count(*) from stud where 1=1 and........
5.成果图:
6.代码实现
需要的包和配置文件:
- myConUtil.jar----自己写的c3p0pool工具类
- commons-dbutils-1.4.jar
- mysql-connector-java-5.1.34-bin.jar
- c3p0-0.9.1.2.jar
- c3p0-config.xml
index.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- </head>
- <body>
- <a href='<c:url value="/PageServlet"></c:url>'>查看分页技术</a>
- </body>
- </html>
show,jsp
- <span style="font-size:12px;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>演示数据分页</title>
- <link rel="stylesheet" href='<c:url value="/css/table.css"></c:url>'
- media="screen">
- <script type="text/javascript">
- function onsub(obj){
- window.location.href="<c:url value='/PageServlet?page='></c:url>"+obj.value;
- }
- </script>
- </head>
- <body>
- <h3>以下是当前页的内容</h3>
- <form action="<c:url value='/PageServlet'/>" method="post" >
- 请输入要查询的关键字:<br/>
- 学号:<input type="text" name="serachId" value="${stud.id }"><br/>
- 姓名:<input type="text" name="serachName" value="${stud.name }"><br/>
- <input type="submit" value="搜索">
- </form>
- <table>
- <c:if test="${!empty map.datas}">
- <tr>
- <th>学号</th>
- <th>姓名</th>
- </tr>
- </c:if>
- <c:forEach items="${map.datas}" var="stud">
- <tr>
- <td>${stud.id }</td>
- <td>${stud.name }</td>
- </tr>
- </c:forEach>
- </table>
- <c:if test="${map.currentPage!=1}" var="boo">
- <a href="<c:url value='/PageServlet?page=${map.currentPage-1}'></c:url>" >上一页</a>
- </c:if>
- <c:forEach var="idx" begin="${map.showStart }" end="${map.showEnd }">
- <c:if test="${map.currentPage==idx}" var="boo">
- <font face="STCAIYUN"><a
- href="<c:url value='/PageServlet?page=${idx}'></c:url>">${idx}</a>
- </font>
- </c:if>
- <c:if test="${!boo}">
- <a href="<c:url value='/PageServlet?page=${idx}'></c:url>">${idx}</a>
- </c:if>
- </c:forEach>
- <c:if test="${map.currentPage!=map.pageCount}" var="boo">
- <a href="<c:url value='/PageServlet?page=${map.currentPage+1}'></c:url>">下一页</a>
- </c:if>
- <br/>
- <br/>
- <br/>
- <select onchange="onsub(this)">
- <c:forEach var="i" begin="1" end="${map.pageCount }">
- <option <c:if test="${i==map.currentPage }" >selected="selected" </c:if> value="${i}" >
- <a href="<c:url value='/PageServlet?page=${i}'></c:url>">第 ${i } 页</a>
- </option>
- </c:forEach>
- </select>
- </body>
- </html></span>
table.css
- <span style="font-size:12px;">table{
- color: green;
- border: 1px solid blue;
- border-collapse: collapse;
- width:500px;
- margin: auto;
- }
- td{
- border: 1px solid blue;
- }
- th{
- border: 1px solid blue;
- }
- body{
- text-align: center;
- }</span>
PageServlet.Java
- <span style="font-size:12px;">package cn.hncu.page1.servlet;
- import java.io.IOException;
- import java.sql.SQLException;
- import java.util.Map;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import cn.hncu.page1.domain.Stud;
- import cn.hncu.page1.service.IPageService;
- import cn.hncu.page1.service.PageService;
- public class PageServlet extends HttpServlet {
- private IPageService service=new PageService();
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doPost(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- request.setCharacterEncoding("utf-8");
- //这里是搜索区域的操作
- Stud stud=null;
- if(request.getMethod().equals("POST")){
- if (stud==null) {
- stud = new Stud();
- }
- String serachId = request.getParameter("serachId");
- String serachName = request.getParameter("serachName");
- stud.setId(serachId);
- stud.setName(serachName);
- request.getSession().setAttribute("stud", stud);
- }else{
- stud=(Stud) request.getSession().getAttribute("stud");
- if (stud==null) {
- stud = new Stud();
- }
- }
- //封装studs对象
- int currentPage=1;
- try {
- currentPage = Integer.parseInt(request.getParameter("page"));
- } catch (NumberFormatException e) {
- currentPage=1;
- }
- Map<String, Object> map=null;
- try {
- map=service.query(currentPage,stud);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- map.put("currentPage", currentPage);
- //显示滚动页号
- int showStart=0;//从第几个页号开始显示
- int showEnd=0;//从第几个页号结束显示
- int showSize=10;//显示多少页数
- int pageCount=Integer.parseInt(""+map.get("pageCount"));
- if(showSize>pageCount){//显示页数大于于总页数
- showStart=1;
- showEnd=pageCount;
- }else{
- if(currentPage<=showSize/2){
- showStart=1;
- showEnd=showSize;
- }else{
- showStart=currentPage-showSize/2;
- showEnd=showStart+showSize-1;
- }
- }
- if(showEnd>pageCount){
- showEnd=pageCount;
- showStart=showEnd-showSize;
- }
- map.put("showStart", showStart);
- map.put("showEnd", showEnd);
- request.setAttribute("map", map);
- request.getRequestDispatcher("/jsps/show.jsp").forward(request, response);
- }
- }</span>
IPageService.java
- <span style="font-size:12px;">package cn.hncu.page1.service;
- import java.sql.SQLException;
- import java.util.Map;
- import cn.hncu.page1.domain.Stud;
- public interface IPageService {
- public Map<String, Object> query(int currentPage, Stud stud) throws SQLException;
- }</span>
PageService.java
- <span style="font-size:12px;"> package cn.hncu.page1.service;
- import java.sql.SQLException;
- import java.util.Map;
- import cn.hncu.page1.dao.PageDao;
- import cn.hncu.page1.dao.PageDaoJdbc;
- import cn.hncu.page1.domain.Stud;
- public class PageService implements IPageService{
- private PageDao dao=new PageDaoJdbc();
- @Override
- public Map<String, Object> query(int currentPage, Stud stud)
- throws SQLException {
- return dao.query(currentPage,stud);
- }
- }</span>
PageDao.java
- <span style="font-size:12px;">package cn.hncu.page1.dao;
- import java.sql.SQLException;
- import java.util.Map;
- import cn.hncu.page1.domain.Stud;
- public interface PageDao {
- public Map<String, Object> query(int currentPage, Stud stud) throws SQLException;
- }</span>
PageDaoJdbc.java
- <span style="font-size:12px;">package cn.hncu.page1.dao;
- import java.sql.SQLException;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.sql.DataSource;
- import org.apache.commons.dbutils.QueryRunner;
- import org.apache.commons.dbutils.handlers.MapListHandler;
- import org.apache.commons.dbutils.handlers.ScalarHandler;
- import org.junit.Test;
- import cn.hncu.page1.domain.Stud;
- import cn.hncu.page1.service.IPageService;
- import cn.hncu.pool.C3p0Pool;
- public class PageDaoJdbc implements PageDao{
- private static final int PAGE_SIZE=10;
- @Override
- public Map<String, Object> query(int currentPage, Stud stud) throws SQLException {
- Map<String, Object> map=new HashMap<String, Object>();
- DataSource pool=C3p0Pool.getPool();
- QueryRunner qr=new QueryRunner(pool);
- String sql="select count(*) from stud where 1=1 ";
- if(stud.getId()!=null&&stud.getId().trim().length()>0){
- sql+="and id like '%"+stud.getId()+"%'";
- }
- if(stud.getName()!=null&&stud.getName().trim().length()>0){
- sql+="and name like '%"+stud.getName()+"%'";
- }
- int rows=Integer.parseInt(""+ qr.query(sql, new ScalarHandler()));
- int pageCount=rows/PAGE_SIZE+((rows%PAGE_SIZE==0)?0:1);
- map.put("pageCount", pageCount);
- int startRow=(currentPage-1)*PAGE_SIZE;
- map.put("startRow", startRow);
- String sql2="select * from stud where 1=1 ";//这种判断方法,很不错
- if(stud.getId()!=null&&stud.getId().trim().length()>0){
- sql2+="and id like '%"+stud.getId()+"%'";
- }
- if(stud.getName()!=null&&stud.getName().trim().length()>0){
- sql2+="and name like '%"+stud.getName()+"%' ";
- }
- sql2+="limit "+startRow+" , "+PAGE_SIZE;
- List<Map<String, Object>> datas=qr.query(sql2, new MapListHandler());
- map.put("datas", datas);
- return map;
- }
- }</span>
Stud.java
- <span style="font-size:12px;">package cn.hncu.page1.domain;
- public class Stud {
- private String id;
- private String name;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public String toString() {
- return "Stud [id=" + id + ", name=" + name + "]";
- }
- }
Mysql学习总结(32)——MySQL分页技术详解的更多相关文章
- Linq学习总结1--参考Linq技术详解
2个要点: 1.linq操作的集合必须实现IEnumerable接口,所以在这3.0之前为实现该接口的集合需通过Cast或TypeOf方法转换成可Linq的集合; 2.查询式和Lame那啥表达式都可以 ...
- Android(java)学习笔记32:Android布局详解之一:FrameLayout
1. FrameLayout是最简单的布局了.所有放在布局里的控件,都按照层次堆叠在屏幕的左上角.后加进来的控件覆盖前面的控件. 在FrameLayout布局里,定义任何空间的位置相关的属性都毫无意义 ...
- Mysql高手系列 - 第8篇:详解排序和分页(order by & limit),及存在的坑
这是Mysql系列第8篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符号分开的表示可选其一. 本章内容 详解排序查询 详解limit limit存在的坑 分 ...
- Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!
这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...
- Mysql高手系列 - 第14篇:详解事务
这是Mysql系列第14篇. 环境:mysql5.7.25,cmd命令中进行演示. 开发过程中,会经常用到数据库事务,所以本章非常重要. 本篇内容 什么是事务,它有什么用? 事务的几个特性 事务常见操 ...
- MySQL 8.0.20 安装教程图文详解(windows 64位)
MySQL 8.0.20 安装教程图文详解(windows 64位) 更新时间:2020年05月09日 15:09:04 转载 作者:瘦肉粥不加糖 这篇文章主要介绍了MySQL 8.0. ...
- MYSQL服务器my.cnf配置文档详解
MYSQL服务器my.cnf配置文档详解 硬件:内存16G [client] port = 3306 socket = /data/3306/mysql.sock [mysql] no-auto-re ...
- mysql服务性能优化—my.cnf配置说明详解
MYSQL服务器my.cnf配置文档详解硬件:内存16G [client]port = 3306socket = /data/3306/mysql.sock [mysql]no-auto-rehash ...
- ambari-server启动出现ERROR main] DBAccessorImpl:106 - Error while creating database accessor java.lang.ClassNotFoundException:com.mysql.jdbc.Driver问题解决办法(图文详解)
不多说,直接上干货! 问题详情 ambari-server启动时,报如下的错误 问题分析 注:启动ambari访问前,请确保mysql驱动已经放置在/usr/share/Java内且名字是mysql- ...
随机推荐
- RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】
http://blog.csdn.net/deadgrape/article/details/50574459 接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动 ...
- CF894A QAQ
CF894A QAQ 题意翻译 题目大意: 给定一个字符串,字符串长度<=100,现在要求出字符串中'QAQ'的个数,注意,'QAQ'可以不连续,只要有顺序就可以了,例如QABQ也有一个QAQ ...
- [Node.js] Proxy Requests for Local and Remote Service Parity
High availability apps require that no distinction be made between local and remote services. Attach ...
- 浅析C++绑定到Lua的方法
注:原文也在公司内部论坛上发了 概述 尽管将C++对象绑定到Lua已经有tolua++(Cocos2d-x 3.0用的就是这个).LuaBridge(我们游戏client对这个库进行了改 ...
- SqlHelper——仅仅由于在人群中多看了你一眼
一.SqlHelper 出场 不是由于大家都在用SqlHelper所以才用,是由于连接数据库关闭数据库查询数据库的多了也就加上了SqlHelper.当你的非常多需求都有一个同样的方法的时候我们没有必要 ...
- 技术总结--android篇(一)--MVC模式
先介绍下MVC模式:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显 ...
- HTML5开发移动web应用——Sencha Touch篇(8)
DataView是Sencha Touch中最重要的组件,用于数据的可视化.数据可视化的重要性不言而喻,能够讲不论什么数据以形象的方式展示给用户. 眼下,怎样更好地可视化是很多公司或框架都在追求的. ...
- Codeforces 558B Amr and The Large Array
B. Amr and The Large Array time limit per test 1 second memory limit per test 256 megabytes input st ...
- java 基本数据类型及自己主动类型提升
基本数据类型:8种 1.整型: byte 1个字节 8位 -128到127 short 2个字节 16位 -2^15到(2^15)-1 int 4个字节 32 ...
- Foundation框架经常使用数据类型和NSAutoreleasePool自己主动释放池解析
第一.NSAutoreleasePool自己主动释放池解析 1.自己主动释放池的物理实现 自己主动释放池用栈来实现.当你创建一个新的自己主动释放池是,会压栈到栈顶.接受autorelease消息的对象 ...
