Hibernate框架數(shù)據(jù)分頁技術(shù)實例分析
本文實例講述了Hibernate框架數(shù)據(jù)分頁技術(shù)。分享給大家供大家參考,具體如下:
1.數(shù)據(jù)分頁機制基本思想:
(1)確定記錄跨度,即確定每頁顯示的記錄條數(shù),可根據(jù)實際情況而定。
(2)獲取記錄總數(shù),即獲取要顯示在頁面中的總記錄數(shù),其目的是根據(jù)該數(shù)來確定總的分布數(shù)。
(3)確定分頁后的總頁數(shù)??筛鶕?jù)公式:“總頁數(shù)=(總記錄數(shù) - 1) / 每頁顯示的記錄數(shù) + 1”。
(4)根據(jù)當前頁數(shù)顯示數(shù)據(jù)。如果該頁數(shù)小于1,則使其等于1;如果大于最大頁數(shù),則使其等于最大頁數(shù)。
(5)通過For、While循環(huán)語句分布顯示查詢結(jié)果。
2.獲取前n條記錄:
SQL語法:
SELECT TOP n FROM table WHERE ... ORDER BY ...
例如:獲取前4條記錄
select top 4 * from car
3.獲取分頁數(shù)據(jù):
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
其中參數(shù)說明如下:
pagesize:每頁顯示的記錄數(shù)
page:當前頁數(shù)
car:數(shù)據(jù)表名
4.MySQL 數(shù)據(jù)庫分頁
MySQL數(shù)據(jù)庫提供了LIMIT函數(shù),利用該函數(shù)可輕松實現(xiàn)數(shù)據(jù)分頁。
LIMIT函數(shù)用來限制SELECT查詢語句返回的行數(shù)。
語法:
SELECT ...FROM table WHERE... ORDER BY ... LIMIT [offset], rows
其中參數(shù)說明如下:
offset:指定要返回的第一行的偏移量。開始行的偏移量是0。是可選的。
rows:指定返回行的數(shù)目。
5.MySQL獲取分頁數(shù)據(jù)
/**
*
* @param page 第幾頁
* @param pagesize 每頁顯示記錄數(shù)
* @return 返回結(jié)果集
*/
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; // 定義查詢結(jié)果集對象
try {
pstmt = conn.createStatement();
rs = pstmt.executeQuery(strSql); // 執(zhí)行查詢語句
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstmt != null) {
rs.close();
pstmt.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return rs; // 返回結(jié)果集
}
6.數(shù)據(jù)分頁示例
6.1Paging項目結(jié)構(gòu):

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"); // 靜態(tài)塊中實現(xiàn)加載數(shù)據(jù)庫驅(qū)動
} 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();
// 根據(jù)分頁
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; // 定義查詢結(jié)果集對象
List lstList = new ArrayList(); // 定義集合對象
try {
pstmt = conn.createStatement();
rs = pstmt.executeQuery(strSql); // 執(zhí)行查詢語句
while (rs.next()) { // 循環(huán)遍歷查詢結(jié)果集
Car car = new Car(); // 創(chuàng)建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 每頁顯示記錄數(shù)
* @return 返回結(jié)果集
*/
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; // 定義查詢結(jié)果集對象
try {
pstmt = conn.createStatement();
rs = pstmt.executeQuery(strSql); // 執(zhí)行查詢語句
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstmt != null) {
rs.close();
pstmt.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return rs; // 返回結(jié)果集
}
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">
發(fā)動機編號
</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運行結(jié)果截圖:

7.Hibernate分頁
7.1HQL分頁
HQL主要是通過setFirstResult()方法與setMaxResults()方法來實現(xiàn)數(shù)據(jù)分頁。
(1)setFirstResult(int index)方法 用于檢索數(shù)據(jù)開始索引位置,索引位置起始值為0。
(2)setMaxResults(int amount) 方法用于計算每次最多加載的記錄條數(shù),默認情況下從設(shè)定的開始索引位置到最后。
例如:檢索出從索引位置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 數(shù)據(jù)分頁方法:
/**
* 使用hql語句進行分頁查詢
* @param hql 需要查詢的hql語句
* @param offset 第一條記錄索引
* @param pageSize 每頁需要顯示的記錄數(shù)
* @return 當前頁的所有記錄
*/
public List findByPage(final String hql,
final int offset, final int pageSize)
{
//通過一個HibernateCallback對象來執(zhí)行查詢
List list = getHibernateTemplate()
.executeFind(new HibernateCallback()
{
//實現(xiàn)HibernateCallback接口必須實現(xiàn)的方法
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//執(zhí)行Hibernate分頁查詢
List result = session.createQuery(hql)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
/**
* 使用hql語句進行分頁查詢
* @param hql 需要查詢的hql語句
* @param value 如果hql有一個參數(shù)需要傳入,value就是傳入hql語句的參數(shù)
* @param offset 第一條記錄索引
* @param pageSize 每頁需要顯示的記錄數(shù)
* @return 當前頁的所有記錄
*/
public List findByPage(final String hql , final Object value ,
final int offset, final int pageSize)
{
//通過一個HibernateCallback對象來執(zhí)行查詢
List list = getHibernateTemplate()
.executeFind(new HibernateCallback()
{
//實現(xiàn)HibernateCallback接口必須實現(xiàn)的方法
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//執(zhí)行Hibernate分頁查詢
List result = session.createQuery(hql)
//為hql語句傳入?yún)?shù)
.setParameter(0, value)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
/**
* 使用hql語句進行分頁查詢
* @param hql 需要查詢的hql語句
* @param values 如果hql有多個個參數(shù)需要傳入,values就是傳入hql的參數(shù)數(shù)組
* @param offset 第一條記錄索引
* @param pageSize 每頁需要顯示的記錄數(shù)
* @return 當前頁的所有記錄
*/
public List findByPage(final String hql, final Object[] values,
final int offset, final int pageSize)
{
//通過一個HibernateCallback對象來執(zhí)行查詢
List list = getHibernateTemplate()
.executeFind(new HibernateCallback()
{
//實現(xiàn)HibernateCallback接口必須實現(xiàn)的方法
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//執(zhí)行Hibernate分頁查詢
Query query = session.createQuery(hql);
//為hql語句傳入?yún)?shù)
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程序設(shè)計有所幫助。
- Hibernate延遲加載技術(shù)詳解
- 淺析Java的Hibernate框架中的緩存和延遲加載機制
- java Hibernate延遲加載
- Hibernate分頁的兩種實現(xiàn)方法
- 基于hibernate實現(xiàn)的分頁技術(shù)實例分析
- Hibernate批量處理海量數(shù)據(jù)的方法
- hibernate批量操作實例詳解
- Struts2+Hibernate實現(xiàn)數(shù)據(jù)分頁的方法
- Hibernate框架中的緩存技術(shù)詳解
- Hibernate實現(xiàn)批量添加數(shù)據(jù)的方法
- Hibernate的Annotation版Hello world實例
- Hibernate環(huán)境搭建與配置方法(Hello world配置文件版)
- Hibernate延遲加載原理與實現(xiàn)方法
相關(guān)文章
Spring注解@Profile實現(xiàn)開發(fā)環(huán)境/測試環(huán)境/生產(chǎn)環(huán)境的切換
在進行軟件開發(fā)過程中,一般會將項目分為開發(fā)環(huán)境,測試環(huán)境,生產(chǎn)環(huán)境。本文主要介紹了Spring如何通過注解@Profile實現(xiàn)開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境的切換,需要的可以參考一下2023-04-04
SpringBoot使用自定義注解實現(xiàn)數(shù)據(jù)脫敏過程詳細解析
這篇文章主要介紹了SpringBoot自定義注解之脫敏注解詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
深入了解SpringBoot中@InitBinder注解的使用
這篇文章主要介紹了深入了解SpringBoot中@InitBinder注解的使用,@InitBinder注解可以作用在被@Controller注解的類的方法上,表示為當前控制器注冊一個屬性編輯器,用于對WebDataBinder進行初始化,且只對當前的Controller有效,需要的朋友可以參考下2023-10-10
java 中ArrayList迭代的兩種實現(xiàn)方法
這篇文章主要介紹了java 中ArrayList迭代的兩種實現(xiàn)方法的相關(guān)資料,Iterator與for語句的結(jié)合,需要的朋友可以參考下2017-09-09

