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 + "]";
    }

}

</span>

时间: 2024-10-12 14:27:56

mysql笔记十——数据库分页技术(再分页,模糊查询)的相关文章

mysql笔记8_数据库设计步骤

step1: 收集信息,与谈系统有关的人员进行交流.座谈,充分了解数据库需要完成的任务. 示例:blog系统 基本功能:发表和编辑文章,多用户支持,全文检索,RSS支持,图片收藏,管理站内短消息. step2: 标识对象(实体Entity) 标识数据库要管理的关键对象或实体. 实体一般是名词: 博主账号:发表和管理文章.图片管理. 文章类别 文章 文章回复 图片分类 图片 连接分类 连接 短消息 step3: 标识每个实体的属性 E-R图(Entity-Relationship) |     符

mysql笔记1_数据库发展史

数据库发展史 萌芽阶段--文件系统 初级阶段--第一代数据库:网状模型.层次模型的数据库. 中级阶段--第二代数据库:关系型数据库和结构化查询语句. 高级阶段--第三代数据库:“关系-对象”型数据库. 数据库管理系统(DBMS) SQL(Strutured Query Language)结构化查询语言 DDL(Data Definition Language)数据定义语言 DML(Data Management Language)数据操作语言.mysql自动提交(auto commit),Ora

Oracle数据库,忽略大小写Like模糊查询(SQL Server,MySql原理相同)

背景 在使用Oracle或者其它数据库时,使用like 关键字进行模糊查询是大家经常使用的功能,在纯中文环境中使用非常好用,还有一些通配符可以使用,但是在纯英文环境中,会出现大小需要精确匹配的问题,主要原因还是字符串的问题 FL like '%{0}%' and 这里like后是一个字符串,这样必然会有大小敏感的问题.比如如下的大小混编的字段 解决方案 方案1 使用Oracle系统函数对需要查询的列字符串进行小写转换(大写也行,变量相关部分都是大写转换),如下所示: select * from

【MySQL笔记】数据库的查询

数据库的查询 注:文中 [ ...] 代表该部分可以去掉. 理论基础:对表对象的一组关系运算,即选择(selection).投影(projection)和连接(join) 1.select语句 子语句顺序: select  [distinct | distinctRow | all]    ----distinct关键字会在结果集中去掉重复的值而只保留一个值,否则有重复值 from where group by having order by                           

Mybatis中oracle、mysql、db2、sql server的like模糊查询

<!-- oracle --> <select id="searchUserBySearchName" parameterType="java.lang.String" resultType="com.urm.entity.User"> select * from t_user where user_name like CONCAT('%',#{search_name},'%') </select> <!

Mybatis在oracle、mysql、db2、sql server的like模糊查询

<!-- oracle --> <select id="searchUserBySearchName" parameterType="java.lang.String" resultType="com.urm.entity.User"> select * from t_user where user_name like CONCAT('%',#{search_name},'%') </select> <!

Oracle 数据库中在使用中文模糊查询时输入中文查询不到结果的解决方法

添加环境变量 变量名:NLS_LANG 变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK

25、连接池(DBCP、C3P0)、动态代理与分页技术

连接池 思考: 程序中连接如何管理? 1. 连接资源宝贵:需要对连接管理 2. 连接: a) 操作数据库,创建连接 b) 操作结束, 关闭! 分析: 涉及频繁的连接的打开.关闭,影响程序的运行效率! 连接管理: 预先创建一组连接,有的时候每次取出一个: 用完后,放回: 学习连接池: a. 自定义一个连接池 b. 学习优秀的连接池组件 a) DBCP b) C3P0 动态代理 Java提供了一个Proxy类,调用它的newInstance方法可以生成某个对象的代理对象,使用该方法生成代理对象时,需

Web开发之分页技术

熟悉Web开发的小伙伴们都知道分页这个玩意儿,但是不会编程的小伙伴们对这个也绝对不陌生,只是不知道这是在Web开发中的一个非常重要的需求和技术罢了. 大家在浏览网上的文章或者图片的时候,经常会看到如下所示的页码显示效果: 这就是所谓的分页技术.为什么要进行分页呢? 很简单内容过多,会使我们的网页过长,我们在浏览网页的时候,不得不一直拖着滚动条或者一直去转鼠标的滚轮,才能看到全部的内容,转一圈.两圈.三圈,你觉得没什么,但是一直这么转下去,相信你会觉得非常的不爽,如此一来,为了获得更好的用户体验,