浅析数据分页技术

数据库分页技术

1.数据分页机制基本思想:

(1)确定记录跨度,即确定每页显示的记录条数,可根据实际情况而定。

(2)获取记录总数,即获取要显示在页面中的总记录数,其目的是根据该数来确定总的分布数。

(3)确定分页后的总页数。可根据公式:“总页数=(总记录数 - 1) / 每页显示的记录数 + 1”。

(4)根据当前页数显示数据。如果该页数小于1,则使其等于1;如果大于最大页数,则使其等于最大页数。

(5)通过For、While循环语句分布显示查询结果。

2.获取前n条记录:

SQL语法:

SELECT TOP n 
FROM table
WHERE ...
ORDER BY ... 
例如:获取前4条记录
select top 4 * from car

3.获取分页数据:

String sql = "select top"+pagesize+"* from car where id not
in (select top "+(page-1)*pagesize+"id from car order by id ASC)
order by id ASC
其中参数说明如下:

pagesize:每页显示的记录数

page:当前页数

car:数据表名

4.MySQL 数据库分页

MySQL数据库提供了LIMIT函数,利用该函数可轻松实现数据分页。

LIMIT函数用来限制SELECT查询语句返回的行数。

语法:

SELECT ...FROM table
WHERE...
ORDER BY ...
LIMIT [offset], rows

其中参数说明如下:

offset:指定要返回的第一行的偏移量。开始行的偏移量是0。是可选的。

rows:指定返回行的数目。

5.MySQL获取分页数据

        /**
	 * 
	 * @param page 第几页
	 * @param pagesize 每页显示记录数
	 * @return 返回结果集
	 */
	public ResultSet findOrder(int page, int pagesize) {
		String strSql = "select * from car order by id limit " + (page - 1)
				* pagesize + "," + pagesize + ""; // 定义SQL查询语句
		Statement pstmt = null;
		ResultSet rs = null; // 定义查询结果集对象
		try {
			pstmt = conn.createStatement();
			rs = pstmt.executeQuery(strSql); // 执行查询语句
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null) {
					rs.close();
					pstmt.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return rs; // 返回结果集
	}

6.数据分页示例

6.1Paging项目结构:

6.2Car.java程序清单:

package com.cdd.util;

/**
 * 车辆信息
 * @author Xu Qiao Hui
 *
 */
public class Car {
	private String Id;
	private String name;;
	private String brand;
	private String engineNum;
	private String state;
	private String remarks;

	public Car(int size){}
	
	public Car(){}
	
	public Car(String id, String name, String brand, String engineNum,
			String state, String remarks) {
		super();
		Id = id;
		this.name = name;
		this.brand = brand;
		this.engineNum = engineNum;
		this.state = state;
		this.remarks = remarks;
	}

	public String getId() {
		return Id;
	}

	public void setId(String id) {
		Id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getBrand() {
		return brand;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	public String getEngineNum() {
		return engineNum;
	}

	public void setEngineNum(String engineNum) {
		this.engineNum = engineNum;
	}

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}

	public String getRemarks() {
		return remarks;
	}

	public void setRemarks(String remarks) {
		this.remarks = remarks;
	}
    
	

}

6.3GetConn.java程序清单:

package com.cdd.util;

import java.sql.*;

public class GetConn {

	static {
		try {
			Class.forName("com.mysql.jdbc.Driver"); // 静态块中实现加载数据库驱动
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	public Connection getConn() {
		Connection connection = null;
		String url = "jdbc:mysql://localhost:3306/oa";
		String userName = "root";
		String passWord = "1120";
		try {
			connection = DriverManager.getConnection(url, userName, passWord);
			System.out.println("ok");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return connection;
	}

	public static void main(String[] args) {
		GetConn getConn = new GetConn();
		getConn.getConn();
	}
}

6.4PaginationUtil.java程序清单:

package com.cdd.util;

import java.util.*;
import java.sql.*;

public class PaginationUtil {
	GetConn getConn = new GetConn();
	Connection conn = getConn.getConn();

	// 根据分页
	public List findGrade(int page, int pagesize) {
		String strSql = "select * from car order by id limit " + (page - 1)
				* pagesize + "," + pagesize + ""; // 定义SQL查询语句
		Statement pstmt = null;
		ResultSet rs = null; // 定义查询结果集对象
		List lstList = new ArrayList(); // 定义集合对象
		try {
			pstmt = conn.createStatement();
			rs = pstmt.executeQuery(strSql); // 执行查询语句
			while (rs.next()) { // 循环遍历查询结果集
				Car car = new Car(); // 创建car
				car.setId(rs.getString("Id"));
				car.setName(rs.getString("name"));
				car.setBrand(rs.getString("brand"));
				car.setEngineNum(rs.getString("engineNum"));
				car.setState(rs.getString("state"));
				car.setRemarks(rs.getString("remarks"));
				lstList.add(car); // 向集合中添加对象
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null) {
					rs.close();
					pstmt.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return lstList; // 返回查询集合对象
	}

	/**
	 * 
	 * @param page 第几页
	 * @param pagesize 每页显示记录数
	 * @return 返回结果集
	 */
	public ResultSet findOrder(int page, int pagesize) {
		String strSql = "select * from car order by id limit " + (page - 1)
				* pagesize + "," + pagesize + ""; // 定义SQL查询语句
		Statement pstmt = null;
		ResultSet rs = null; // 定义查询结果集对象
		try {
			pstmt = conn.createStatement();
			rs = pstmt.executeQuery(strSql); // 执行查询语句
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null) {
					rs.close();
					pstmt.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return rs; // 返回结果集
	}

	public int allPage(int pagesize) {
		int allp = 0;
		try {
			Statement pstmt = conn.createStatement();
			pstmt.execute("select count(*) from car");
			ResultSet rs = pstmt.getResultSet();
			System.out.print("00");
			rs.next();
			int all = rs.getInt(1);
			System.out.print(all);
			allp = (all - 1) / pagesize + 1;
			System.out.println(allp);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return allp;

	}

	public static void main(String[] args) {
		PaginationUtil pageinationUtil = new PaginationUtil();
		List list = pageinationUtil.findGrade(2, 6);
		for (int i = 0; i < list.size(); i++) {
			Car car = (Car) list.get(i);
			System.out.println(car.getId() + " " + car.getName());
		}
	}
}

6.5index.jsp程序清单:

<%@ page language="java" import="java.util.*,com.cdd.util.*;"
	pageEncoding="gbk"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>My JSP 'index.jsp' starting page</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	</head>

	<body>
		<center>
			<h5>
				车辆信息分页显示
			</h5>
		</center>
		<table width="400" height="44" border="1" align="center"
			bordercolor="#CC00CC" class="unnamed1">
			<tr>
				<td width="83">
					车牌号
				</td>
				<td width="67">
					车辆名称
				</td>
				<td width="67">
					品牌
				</td>
				<td width="67">
					发动机编号
				</td>
			</tr>
			<%
				PaginationUtil paginationUtil = new PaginationUtil();
				int pageNo = 0;
				if (request.getParameter("No") == null) {
					pageNo = 1;
				} else {
					pageNo = Integer.parseInt(request.getParameter("No"));
				}
				List cc = paginationUtil.findGrade(pageNo, 3);
				Iterator i = cc.iterator();
				while (i.hasNext()) {
					Car car = (Car) i.next();
					out.print("<tr><td>" + car.getId() + "</td>" + "<td>"
							+ car.getName() + "</td>" + "<td>" + car.getBrand()
							+ "</td>" + "<td>" + car.getEngineNum() + "</td></tr>");
				}
				int all = paginationUtil.allPage(3);
			%>
		</table>
		<center>
			共<%=all%>页,当前页是第<%=pageNo%>页
			<%
				if (pageNo > 1) {
			%>
			<a href="index.jsp?No=<%=pageNo - 1%>">上一页</a>
			<%
				}
			%>
			<%
				if (pageNo < all) {
			%>
			<a href="index.jsp?No=<%=pageNo + 1%>">下一页</a>
			<%
				}
			%>
		</center>
	</body>
</html>

6.6访问地址:

http://x-pc:8080/Paging/index.jsp

6.7运行结果截图:

7.Hibernate分页

7.1HQL分页

HQL主要是通过setFirstResult()方法与setMaxResults()方法来实现数据分页。

(1)setFirstResult(int index)方法 用于检索数据开始索引位置,索引位置起始值为0。

(2)setMaxResults(int amount) 方法用于计算每次最多加载的记录条数,默认情况下从设定的开始索引位置到最后。

例如:检索出从索引位置2开始的5条记录

Query q = session.createQuery("form car");
q.setFirstResult(2);
q.setMaxResults(5);

7.2QBC分页

例如:检索出从索引位置2开始的5条记录

Criteria c = session.createCriteria("form car");
c.setFirstResult(2);
c.setMaxResults(5);

7.3 数据分页方法:

        /**
	 * 使用hql语句进行分页查询
	 * @param hql 需要查询的hql语句
	 * @param offset 第一条记录索引
	 * @param pageSize 每页需要显示的记录数
	 * @return 当前页的所有记录
	 */
	public List findByPage(final String hql, 
		final int offset, final int pageSize)
	{
		//通过一个HibernateCallback对象来执行查询
		List list = getHibernateTemplate()
			.executeFind(new HibernateCallback()
		{
			//实现HibernateCallback接口必须实现的方法
			public Object doInHibernate(Session session)
				throws HibernateException, SQLException
			{
				//执行Hibernate分页查询
				List result = session.createQuery(hql)
					.setFirstResult(offset)
					.setMaxResults(pageSize)
					.list();
				return result;
			}
		});
		return list;
	}

	/**
	 * 使用hql语句进行分页查询
	 * @param hql 需要查询的hql语句
	 * @param value 如果hql有一个参数需要传入,value就是传入hql语句的参数
	 * @param offset 第一条记录索引
	 * @param pageSize 每页需要显示的记录数
	 * @return 当前页的所有记录
	 */
	public List findByPage(final String hql , final Object value ,
		final int offset, final int pageSize)
	{
		//通过一个HibernateCallback对象来执行查询
		List list = getHibernateTemplate()
			.executeFind(new HibernateCallback()
		{
			//实现HibernateCallback接口必须实现的方法
			public Object doInHibernate(Session session)
				throws HibernateException, SQLException
			{
				//执行Hibernate分页查询
				List result = session.createQuery(hql)
					//为hql语句传入参数
					.setParameter(0, value) 
					.setFirstResult(offset)
					.setMaxResults(pageSize)
					.list();
				return result;
			}
		});
		return list;
	}

	/**
	 * 使用hql语句进行分页查询
	 * @param hql 需要查询的hql语句
	 * @param values 如果hql有多个个参数需要传入,values就是传入hql的参数数组
	 * @param offset 第一条记录索引
	 * @param pageSize 每页需要显示的记录数
	 * @return 当前页的所有记录
	 */
	public List findByPage(final String hql, final Object[] values,
		final int offset, final int pageSize)
	{
		//通过一个HibernateCallback对象来执行查询
		List list = getHibernateTemplate()
			.executeFind(new HibernateCallback()
		{
			//实现HibernateCallback接口必须实现的方法
			public Object doInHibernate(Session session)
				throws HibernateException, SQLException
			{
				//执行Hibernate分页查询
				Query query = session.createQuery(hql);
				//为hql语句传入参数
				for (int i = 0 ; i < values.length ; i++)
				{
					query.setParameter( i, values[i]);
				}
				List result = query.setFirstResult(offset)
					.setMaxResults(pageSize)
					.list();
				return result;
			}
		});
		return list;
	}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值