本文實(shí)例講述了Hibernate框架數(shù)據(jù)分頁(yè)技術(shù)。分享給大家供大家參考,具體如下:
1.數(shù)據(jù)分頁(yè)機(jī)制基本思想:
(1)確定記錄跨度,即確定每頁(yè)顯示的記錄條數(shù),可根據(jù)實(shí)際情況而定。
(2)獲取記錄總數(shù),即獲取要顯示在頁(yè)面中的總記錄數(shù),其目的是根據(jù)該數(shù)來確定總的分布數(shù)。
(3)確定分頁(yè)后的總頁(yè)數(shù)??筛鶕?jù)公式:“總頁(yè)數(shù)=(總記錄數(shù) - 1) / 每頁(yè)顯示的記錄數(shù) + 1”。
(4)根據(jù)當(dāng)前頁(yè)數(shù)顯示數(shù)據(jù)。如果該頁(yè)數(shù)小于1,則使其等于1;如果大于最大頁(yè)數(shù),則使其等于最大頁(yè)數(shù)。
(5)通過For、While循環(huán)語(yǔ)句分布顯示查詢結(jié)果。
2.獲取前n條記錄:
SQL語(yǔ)法:
1
2
3
4
|
SELECT TOP n FROM table WHERE ... ORDER BY ... |
例如:獲取前4條記錄
1
|
select top 4 * from car |
3.獲取分頁(yè)數(shù)據(jù):
1
2
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 |
其中參數(shù)說明如下:
pagesize:每頁(yè)顯示的記錄數(shù)
page:當(dāng)前頁(yè)數(shù)
car:數(shù)據(jù)表名
4.MySQL 數(shù)據(jù)庫(kù)分頁(yè)
MySQL數(shù)據(jù)庫(kù)提供了LIMIT函數(shù),利用該函數(shù)可輕松實(shí)現(xiàn)數(shù)據(jù)分頁(yè)。
LIMIT函數(shù)用來限制SELECT查詢語(yǔ)句返回的行數(shù)。
語(yǔ)法:
1
2
3
4
|
SELECT ... FROM table WHERE ... ORDER BY ... LIMIT [offset], rows |
其中參數(shù)說明如下:
offset:指定要返回的第一行的偏移量。開始行的偏移量是0。是可選的。
rows:指定返回行的數(shù)目。
5.MySQL獲取分頁(yè)數(shù)據(jù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/** * * @param page 第幾頁(yè) * @param pagesize 每頁(yè)顯示記錄數(shù) * @return 返回結(jié)果集 */ public ResultSet findOrder( int page, int pagesize) { String strSql = "select * from car order by id limit " + (page - 1 ) * pagesize + "," + pagesize + "" ; // 定義SQL查詢語(yǔ)句 Statement pstmt = null ; ResultSet rs = null ; // 定義查詢結(jié)果集對(duì)象 try { pstmt = conn.createStatement(); rs = pstmt.executeQuery(strSql); // 執(zhí)行查詢語(yǔ)句 } 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ù)分頁(yè)示例
6.1Paging項(xiàng)目結(jié)構(gòu):
6.2Car.java程序清單:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
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程序清單:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package com.cdd.util; import java.sql.*; public class GetConn { static { try { Class.forName( "com.mysql.jdbc.Driver" ); // 靜態(tài)塊中實(shí)現(xiàn)加載數(shù)據(jù)庫(kù)驅(qū)動(dòng) } 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程序清單:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
package com.cdd.util; import java.util.*; import java.sql.*; public class PaginationUtil { GetConn getConn = new GetConn(); Connection conn = getConn.getConn(); // 根據(jù)分頁(yè) public List findGrade( int page, int pagesize) { String strSql = "select * from car order by id limit " + (page - 1 ) * pagesize + "," + pagesize + "" ; // 定義SQL查詢語(yǔ)句 Statement pstmt = null ; ResultSet rs = null ; // 定義查詢結(jié)果集對(duì)象 List lstList = new ArrayList(); // 定義集合對(duì)象 try { pstmt = conn.createStatement(); rs = pstmt.executeQuery(strSql); // 執(zhí)行查詢語(yǔ)句 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); // 向集合中添加對(duì)象 } } catch (Exception e) { e.printStackTrace(); } finally { try { if (pstmt != null ) { rs.close(); pstmt.close(); } } catch (Exception e) { e.printStackTrace(); } } return lstList; // 返回查詢集合對(duì)象 } /** * * @param page 第幾頁(yè) * @param pagesize 每頁(yè)顯示記錄數(shù) * @return 返回結(jié)果集 */ public ResultSet findOrder( int page, int pagesize) { String strSql = "select * from car order by id limit " + (page - 1 ) * pagesize + "," + pagesize + "" ; // 定義SQL查詢語(yǔ)句 Statement pstmt = null ; ResultSet rs = null ; // 定義查詢結(jié)果集對(duì)象 try { pstmt = conn.createStatement(); rs = pstmt.executeQuery(strSql); // 執(zhí)行查詢語(yǔ)句 } 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程序清單:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
<%@ 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> 車輛信息分頁(yè)顯示 </h5> </center> <table width= "400" height= "44" border= "1" align= "center" bordercolor= "#CC00CC" class = "unnamed1" > <tr> <td width= "83" > 車牌號(hào) </td> <td width= "67" > 車輛名稱 </td> <td width= "67" > 品牌 </td> <td width= "67" > 發(fā)動(dòng)機(jī)編號(hào) </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%>頁(yè),當(dāng)前頁(yè)是第<%=pageNo%>頁(yè) <% if (pageNo > 1 ) { %> <a href= "index.jsp?No=<%=pageNo - 1%>" >上一頁(yè)</a> <% } %> <% if (pageNo < all) { %> <a href= "index.jsp?No=<%=pageNo + 1%>" >下一頁(yè)</a> <% } %> </center> </body> </html> |
6.6訪問地址:
http://x-pc:8080/Paging/index.jsp
6.7運(yùn)行結(jié)果截圖:
7.Hibernate分頁(yè)
7.1HQL分頁(yè)
HQL主要是通過setFirstResult()方法與setMaxResults()方法來實(shí)現(xiàn)數(shù)據(jù)分頁(yè)。
(1)setFirstResult(int index)方法 用于檢索數(shù)據(jù)開始索引位置,索引位置起始值為0。
(2)setMaxResults(int amount) 方法用于計(jì)算每次最多加載的記錄條數(shù),默認(rèn)情況下從設(shè)定的開始索引位置到最后。
例如:檢索出從索引位置2開始的5條記錄
1
2
3
|
Query q = session.createQuery( "form car" ); q.setFirstResult( 2 ); q.setMaxResults( 5 ); |
7.2QBC分頁(yè)
例如:檢索出從索引位置2開始的5條記錄
1
2
3
|
Criteria c = session.createCriteria( "form car" ); c.setFirstResult( 2 ); c.setMaxResults( 5 ); |
7.3 數(shù)據(jù)分頁(yè)方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
/** * 使用hql語(yǔ)句進(jìn)行分頁(yè)查詢 * @param hql 需要查詢的hql語(yǔ)句 * @param offset 第一條記錄索引 * @param pageSize 每頁(yè)需要顯示的記錄數(shù) * @return 當(dāng)前頁(yè)的所有記錄 */ public List findByPage( final String hql, final int offset, final int pageSize) { //通過一個(gè)HibernateCallback對(duì)象來執(zhí)行查詢 List list = getHibernateTemplate() .executeFind( new HibernateCallback() { //實(shí)現(xiàn)HibernateCallback接口必須實(shí)現(xiàn)的方法 public Object doInHibernate(Session session) throws HibernateException, SQLException { //執(zhí)行Hibernate分頁(yè)查詢 List result = session.createQuery(hql) .setFirstResult(offset) .setMaxResults(pageSize) .list(); return result; } }); return list; } /** * 使用hql語(yǔ)句進(jìn)行分頁(yè)查詢 * @param hql 需要查詢的hql語(yǔ)句 * @param value 如果hql有一個(gè)參數(shù)需要傳入,value就是傳入hql語(yǔ)句的參數(shù) * @param offset 第一條記錄索引 * @param pageSize 每頁(yè)需要顯示的記錄數(shù) * @return 當(dāng)前頁(yè)的所有記錄 */ public List findByPage( final String hql , final Object value , final int offset, final int pageSize) { //通過一個(gè)HibernateCallback對(duì)象來執(zhí)行查詢 List list = getHibernateTemplate() .executeFind( new HibernateCallback() { //實(shí)現(xiàn)HibernateCallback接口必須實(shí)現(xiàn)的方法 public Object doInHibernate(Session session) throws HibernateException, SQLException { //執(zhí)行Hibernate分頁(yè)查詢 List result = session.createQuery(hql) //為hql語(yǔ)句傳入?yún)?shù) .setParameter( 0 , value) .setFirstResult(offset) .setMaxResults(pageSize) .list(); return result; } }); return list; } /** * 使用hql語(yǔ)句進(jìn)行分頁(yè)查詢 * @param hql 需要查詢的hql語(yǔ)句 * @param values 如果hql有多個(gè)個(gè)參數(shù)需要傳入,values就是傳入hql的參數(shù)數(shù)組 * @param offset 第一條記錄索引 * @param pageSize 每頁(yè)需要顯示的記錄數(shù) * @return 當(dāng)前頁(yè)的所有記錄 */ public List findByPage( final String hql, final Object[] values, final int offset, final int pageSize) { //通過一個(gè)HibernateCallback對(duì)象來執(zhí)行查詢 List list = getHibernateTemplate() .executeFind( new HibernateCallback() { //實(shí)現(xiàn)HibernateCallback接口必須實(shí)現(xiàn)的方法 public Object doInHibernate(Session session) throws HibernateException, SQLException { //執(zhí)行Hibernate分頁(yè)查詢 Query query = session.createQuery(hql); //為hql語(yǔ)句傳入?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; } |
希望本文所述對(duì)大家基于Hibernate框架的Java程序設(shè)計(jì)有所幫助。