本文实例讲述了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>
<%
}
%>
<%
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;
}
希望本文所述对大家基于Hibernate框架的Java程序设计有所帮助。
本文地址:https://www.stayed.cn/item/14912
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我