在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

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

2016-8-29 13:22| 发布者: zhangjf| 查看: 638| 评论: 0

摘要: 本文实例讲述了Hibernate框架数据分页技术。分享给大家供大家参考,具体如下: 1.数据分页机制基本思想: (1)确定记录跨度,即确定每页显示的记录条数,可根据实际情况而定。 (2)获取记录总数,即获取要显示在页 ...

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

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

(1)确定记录跨度,即确定每页显示的记录条数,可根据实际情况而定。
(2)获取记录总数,即获取要显示在页面中的总记录数,其目的是根据该数来确定总的分布数。
(3)确定分页后的总页数。可根据公式:“总页数=(总记录数 - 1) / 每页显示的记录数 + 1”。
(4)根据当前页数显示数据。如果该页数小于1,则使其等于1;如果大于最大页数,则使其等于最大页数。
(5)通过For、While循环语句分布显示查询结果。

2.获取前n条记录:

SQL语法:

  1. SELECT TOP n
  2. FROM table
  3. WHERE ...
  4. ORDER BY ...
复制代码

例如:获取前4条记录

  1. select top 4 * from car
复制代码

3.获取分页数据:

  1. String sql = "select top"+pagesize+"* from car where id not
  2. in (select top "+(page-1)*pagesize+"id from car order by id ASC)
  3. order by id ASC
复制代码

其中参数说明如下:

pagesize:每页显示的记录数
page:当前页数
car:数据表名

4.MySQL 数据库分页

mysql数据库提供了LIMIT函数,利用该函数可轻松实现数据分页。
LIMIT函数用来限制SELECT查询语句返回的行数。

语法:

  1. SELECT ...FROM table
  2. WHERE...
  3. ORDER BY ...
  4. LIMIT [offset], rows
复制代码

其中参数说明如下:

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

5.MySQL获取分页数据

  1. /**
  2. *
  3. * @param page 第几页
  4. * @param pagesize 每页显示记录数
  5. * @return 返回结果集
  6. */
  7. public ResultSet findOrder(int page, int pagesize) {
  8. String strSql = "select * from car order by id limit " + (page - 1)
  9. * pagesize + "," + pagesize + ""; // 定义SQL查询语句
  10. Statement pstmt = null;
  11. ResultSet rs = null; // 定义查询结果集对象
  12. try {
  13. pstmt = conn.createStatement();
  14. rs = pstmt.executeQuery(strSql); // 执行查询语句
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. } finally {
  18. try {
  19. if (pstmt != null) {
  20. rs.close();
  21. pstmt.close();
  22. }
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. return rs; // 返回结果集
  28. }
复制代码

6.数据分页示例

6.1Paging项目结构:

6.2Car.java程序清单:

  1. package com.cdd.util;
  2. /**
  3. * 车辆信息
  4. * @author Xu Qiao Hui
  5. *
  6. */
  7. public class Car {
  8. private String Id;
  9. private String name;;
  10. private String brand;
  11. private String engineNum;
  12. private String state;
  13. private String remarks;
  14. public Car(int size){}
  15. public Car(){}
  16. public Car(String id, String name, String brand, String engineNum,
  17. String state, String remarks) {
  18. super();
  19. Id = id;
  20. this.name = name;
  21. this.brand = brand;
  22. this.engineNum = engineNum;
  23. this.state = state;
  24. this.remarks = remarks;
  25. }
  26. public String getId() {
  27. return Id;
  28. }
  29. public void setId(String id) {
  30. Id = id;
  31. }
  32. public String getName() {
  33. return name;
  34. }
  35. public void setName(String name) {
  36. this.name = name;
  37. }
  38. public String getBrand() {
  39. return brand;
  40. }
  41. public void setBrand(String brand) {
  42. this.brand = brand;
  43. }
  44. public String getEngineNum() {
  45. return engineNum;
  46. }
  47. public void setEngineNum(String engineNum) {
  48. this.engineNum = engineNum;
  49. }
  50. public String getState() {
  51. return state;
  52. }
  53. public void setState(String state) {
  54. this.state = state;
  55. }
  56. public String getRemarks() {
  57. return remarks;
  58. }
  59. public void setRemarks(String remarks) {
  60. this.remarks = remarks;
  61. }
  62. }
复制代码

6.3GetConn.java程序清单:

  1. package com.cdd.util;
  2. import java.sql.*;
  3. public class GetConn {
  4. static {
  5. try {
  6. Class.forName("com.mysql.jdbc.Driver"); // 静态块中实现加载数据库驱动
  7. } catch (ClassNotFoundException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. public Connection getConn() {
  12. Connection connection = null;
  13. String url = "jdbc:mysql://localhost:3306/oa";
  14. String userName = "root";
  15. String passWord = "1120";
  16. try {
  17. connection = DriverManager.getConnection(url, userName, passWord);
  18. System.out.println("ok");
  19. } catch (SQLException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. }
  23. return connection;
  24. }
  25. public static void main(String[] args) {
  26. GetConn getConn = new GetConn();
  27. getConn.getConn();
  28. }
  29. }
复制代码

6.4PaginationUtil.java程序清单:

  1. package com.cdd.util;
  2. import java.util.*;
  3. import java.sql.*;
  4. public class PaginationUtil {
  5. GetConn getConn = new GetConn();
  6. Connection conn = getConn.getConn();
  7. // 根据分页
  8. public List findGrade(int page, int pagesize) {
  9. String strSql = "select * from car order by id limit " + (page - 1)
  10. * pagesize + "," + pagesize + ""; // 定义SQL查询语句
  11. Statement pstmt = null;
  12. ResultSet rs = null; // 定义查询结果集对象
  13. List lstList = new ArrayList(); // 定义集合对象
  14. try {
  15. pstmt = conn.createStatement();
  16. rs = pstmt.executeQuery(strSql); // 执行查询语句
  17. while (rs.next()) { // 循环遍历查询结果集
  18. Car car = new Car(); // 创建car
  19. car.setId(rs.getString("Id"));
  20. car.setName(rs.getString("name"));
  21. car.setBrand(rs.getString("brand"));
  22. car.setEngineNum(rs.getString("engineNum"));
  23. car.setState(rs.getString("state"));
  24. car.setRemarks(rs.getString("remarks"));
  25. lstList.add(car); // 向集合中添加对象
  26. }
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. } finally {
  30. try {
  31. if (pstmt != null) {
  32. rs.close();
  33. pstmt.close();
  34. }
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. return lstList; // 返回查询集合对象
  40. }
  41. /**
  42. *
  43. * @param page 第几页
  44. * @param pagesize 每页显示记录数
  45. * @return 返回结果集
  46. */
  47. public ResultSet findOrder(int page, int pagesize) {
  48. String strSql = "select * from car order by id limit " + (page - 1)
  49. * pagesize + "," + pagesize + ""; // 定义SQL查询语句
  50. Statement pstmt = null;
  51. ResultSet rs = null; // 定义查询结果集对象
  52. try {
  53. pstmt = conn.createStatement();
  54. rs = pstmt.executeQuery(strSql); // 执行查询语句
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. } finally {
  58. try {
  59. if (pstmt != null) {
  60. rs.close();
  61. pstmt.close();
  62. }
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. return rs; // 返回结果集
  68. }
  69. public int allPage(int pagesize) {
  70. int allp = 0;
  71. try {
  72. Statement pstmt = conn.createStatement();
  73. pstmt.execute("select count(*) from car");
  74. ResultSet rs = pstmt.getResultSet();
  75. System.out.print("00");
  76. rs.next();
  77. int all = rs.getInt(1);
  78. System.out.print(all);
  79. allp = (all - 1) / pagesize + 1;
  80. System.out.println(allp);
  81. } catch (SQLException e) {
  82. e.printStackTrace();
  83. }
  84. return allp;
  85. }
  86. public static void main(String[] args) {
  87. PaginationUtil pageinationUtil = new PaginationUtil();
  88. List list = pageinationUtil.findGrade(2, 6);
  89. for (int i = 0; i < list.size(); i++) {
  90. Car car = (Car) list.get(i);
  91. System.out.println(car.getId() + " " + car.getName());
  92. }
  93. }
  94. }
复制代码

6.5index.jsp程序清单:

  1. <%@ page language="java" import="java.util.*,com.cdd.util.*;"
  2. pageEncoding="gbk"%>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme() + "://"
  6. + request.getServerName() + ":" + request.getServerPort()
  7. + path + "/";
  8. %>
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  10. <html>
  11. <head>
  12. <base href="<%=basePath%>">
  13. <title>My JSP 'index.jsp' starting page</title>
  14. <meta http-equiv="pragma" content="no-cache">
  15. <meta http-equiv="cache-control" content="no-cache">
  16. <meta http-equiv="expires" content="0">
  17. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  18. <meta http-equiv="description" content="This is my page">
  19. <!--
  20. <link rel="stylesheet" type="text/css" href="styles.css">
  21. -->
  22. </head>
  23. <body>
  24. <center>
  25. <h5>
  26. 车辆信息分页显示
  27. </h5>
  28. </center>
  29. <table width="400" height="44" border="1" align="center"
  30. bordercolor="#CC00CC" class="unnamed1">
  31. <tr>
  32. <td width="83">
  33. 车牌号
  34. </td>
  35. <td width="67">
  36. 车辆名称
  37. </td>
  38. <td width="67">
  39. 品牌
  40. </td>
  41. <td width="67">
  42. 发动机编号
  43. </td>
  44. </tr>
  45. <%
  46. PaginationUtil paginationUtil = new PaginationUtil();
  47. int pageNo = 0;
  48. if (request.getParameter("No") == null) {
  49. pageNo = 1;
  50. } else {
  51. pageNo = Integer.parseInt(request.getParameter("No"));
  52. }
  53. List cc = paginationUtil.findGrade(pageNo, 3);
  54. Iterator i = cc.iterator();
  55. while (i.hasNext()) {
  56. Car car = (Car) i.next();
  57. out.print("<tr><td>" + car.getId() + "</td>" + "<td>"
  58. + car.getName() + "</td>" + "<td>" + car.getBrand()
  59. + "</td>" + "<td>" + car.getEngineNum() + "</td></tr>");
  60. }
  61. int all = paginationUtil.allPage(3);
  62. %>
  63. </table>
  64. <center>
  65. 共<%=all%>页,当前页是第<%=pageNo%>页
  66. <%
  67. if (pageNo > 1) {
  68. %>
  69. <a href="index.jsp?No=<%=pageNo - 1%>">上一页</a>
  70. <%
  71. }
  72. %>
  73. <%
  74. if (pageNo < all) {
  75. %>
  76. <a href="index.jsp?No=<%=pageNo + 1%>">下一页</a>
  77. <%
  78. }
  79. %>
  80. </center>
  81. </body>
  82. </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条记录

  1. Query q = session.createQuery("form car");
  2. q.setFirstResult(2);
  3. q.setMaxResults(5);
复制代码

7.2QBC分页

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

  1. Criteria c = session.createCriteria("form car");
  2. c.setFirstResult(2);
  3. c.setMaxResults(5);
复制代码

7.3 数据分页方法:

  1. /**
  2. * 使用hql语句进行分页查询
  3. * @param hql 需要查询的hql语句
  4. * @param offset 第一条记录索引
  5. * @param pageSize 每页需要显示的记录数
  6. * @return 当前页的所有记录
  7. */
  8. public List findByPage(final String hql,
  9. final int offset, final int pageSize)
  10. {
  11. //通过一个HibernateCallback对象来执行查询
  12. List list = getHibernateTemplate()
  13. .executeFind(new HibernateCallback()
  14. {
  15. //实现HibernateCallback接口必须实现的方法
  16. public Object doInHibernate(Session session)
  17. throws HibernateException, SQLException
  18. {
  19. //执行Hibernate分页查询
  20. List result = session.createQuery(hql)
  21. .setFirstResult(offset)
  22. .setMaxResults(pageSize)
  23. .list();
  24. return result;
  25. }
  26. });
  27. return list;
  28. }
  29. /**
  30. * 使用hql语句进行分页查询
  31. * @param hql 需要查询的hql语句
  32. * @param value 如果hql有一个参数需要传入,value就是传入hql语句的参数
  33. * @param offset 第一条记录索引
  34. * @param pageSize 每页需要显示的记录数
  35. * @return 当前页的所有记录
  36. */
  37. public List findByPage(final String hql , final Object value ,
  38. final int offset, final int pageSize)
  39. {
  40. //通过一个HibernateCallback对象来执行查询
  41. List list = getHibernateTemplate()
  42. .executeFind(new HibernateCallback()
  43. {
  44. //实现HibernateCallback接口必须实现的方法
  45. public Object doInHibernate(Session session)
  46. throws HibernateException, SQLException
  47. {
  48. //执行Hibernate分页查询
  49. List result = session.createQuery(hql)
  50. //为hql语句传入参数
  51. .setParameter(0, value)
  52. .setFirstResult(offset)
  53. .setMaxResults(pageSize)
  54. .list();
  55. return result;
  56. }
  57. });
  58. return list;
  59. }
  60. /**
  61. * 使用hql语句进行分页查询
  62. * @param hql 需要查询的hql语句
  63. * @param values 如果hql有多个个参数需要传入,values就是传入hql的参数数组
  64. * @param offset 第一条记录索引
  65. * @param pageSize 每页需要显示的记录数
  66. * @return 当前页的所有记录
  67. */
  68. public List findByPage(final String hql, final Object[] values,
  69. final int offset, final int pageSize)
  70. {
  71. //通过一个HibernateCallback对象来执行查询
  72. List list = getHibernateTemplate()
  73. .executeFind(new HibernateCallback()
  74. {
  75. //实现HibernateCallback接口必须实现的方法
  76. public Object doInHibernate(Session session)
  77. throws HibernateException, SQLException
  78. {
  79. //执行Hibernate分页查询
  80. Query query = session.createQuery(hql);
  81. //为hql语句传入参数
  82. for (int i = 0 ; i < values.length ; i++)
  83. {
  84. query.setParameter( i, values[i]);
  85. }
  86. List result = query.setFirstResult(offset)
  87. .setMaxResults(pageSize)
  88. .list();
  89. return result;
  90. }
  91. });
  92. return list;
  93. }
复制代码

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

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-7 00:57

Copyright 2015-2025 djqfx

返回顶部