Hibernate框架数据分页技术实例分析

本文实例讲述了Hibernate框架数据分页技术。分享给大家供大家参考,具体如下:

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>

<%

}

%>

</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;

}

希望本文所述对大家基于Hibernate框架的Java程序设计有所帮助。

以上是 Hibernate框架数据分页技术实例分析 的全部内容, 来源链接: utcz.com/p/209980.html

回到顶部