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>
      <%
        }
      %>
      <%
        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程序设计有所帮助。

(0)

相关推荐

  • Hibernate批量处理海量数据的方法

    本文实例讲述了Hibernate批量处理海量数据的方法.分享给大家供大家参考,具体如下: Hibernate批量处理海量其实从性能上考虑,它是很不可取的,浪费了很大的内存.从它的机制上讲,Hibernate它是先把符合条件的数据查出来,放到内存当中,然后再进行操作.实际使用下来性能非常不理想,在笔者的实际使用中采用下面的第三种优化方案的数据是:100000条数据插入数据库, 需要约30分钟,呵呵,晕倒.(本人10分钟插入1000000条数据(字段比较小)) 总结下来有三种来处理以解决性能问题:

  • 浅析Java的Hibernate框架中的缓存和延迟加载机制

    hibernate一级缓存和二级缓存的区别 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质.缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期. Hibernate的缓存包括Sessi

  • Struts2+Hibernate实现数据分页的方法

    本文实例讲述了Struts2+Hibernate实现数据分页的方法.分享给大家供大家参考,具体如下: 1.用Hibernate实现分页技术: /** * 使用hql语句进行分页查询 * @param hql 需要查询的hql语句 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ @SuppressWarnings("unchecked") public List findByPage(f

  • 基于hibernate实现的分页技术实例分析

    本文实例讲述了基于hibernate实现的分页技术.分享给大家供大家参考,具体如下: 先说明一下基于hibernate实现分页的原理,假如从数据库取出100条数据,我们要让每页显示10条,假如从30开始,只需要设置起始位置和最大的返回结果即可 先上代码:注意传进来的参数有 Page这类,后面有介绍 public List<Article> queryByPage(final String username, final Page page) { return this.getHibernate

  • java Hibernate延迟加载

    示例数据表:team(班级).certificate(身份证).student(学生)Team.hbm.xml<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hiber

  • Hibernate框架中的缓存技术详解

    本文实例讲述了Hibernate框架中的缓存技术.分享给大家供大家参考,具体如下: Hibernate框架的缓存分为Session的缓存.SessionFactory的缓存,也称为一级缓存和二级缓存. 一级缓存: 一级缓存是Session级的缓存,其生命周期很短,与Session相互对应,由Hibernate进行管理,属于事务范围的缓存.当程序调用 Session的load()方法.get()方法.save()方法.saveOrUpdate()方法.update()方法或查询接口方法时,Hibe

  • Hibernate延迟加载技术详解

    本文实例讲述了Hibernate延迟加载技术.分享给大家供大家参考,具体如下: Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载.Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能. 下面先来剖析 Hibernate 延迟加载的"秘密". 集合属性的延迟加载 当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性

  • hibernate批量操作实例详解

    本文实例讲述了hibernate批量操作的方法.分享给大家供大家参考,具体如下: Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete()方法来删除持久化对象,Hibernate将负责删除对应的数据记录:当执行持久化对象的set方法时,Hibernate将自动转换为对应的update方法,修改数据库的对应记录. 问题是如果需要同时更新100 000条记录,是不

  • Hibernate的Annotation版Hello world实例

    本文实例讲述了Hibernate的Annotation版Hello world实现方法.分享给大家供大家参考,具体如下: 需要引入的包:hibernate-commons-annotations-4.0.4.Final.jar 由于我使用的是:hibernate-release-4.3.5.Final,在required目录下已经有了. bean: import javax.persistence.Column; import javax.persistence.Entity; import j

  • Hibernate实现批量添加数据的方法

    本文实例讲述了Hibernate实现批量添加数据的方法.分享给大家供大家参考,具体如下: 1.Hibernate_016_BatchAddData程序目录结构: 2.lib目录下所引入的jar包: 3.MedicineDao.java源代码: package com.xqh.dao; import java.util.List; import org.hibernate.Session; import com.xqh.model.Medicine; import com.xqh.

  • Hibernate环境搭建与配置方法(Hello world配置文件版)

    本文实例讲述了Hibernate环境搭建与配置方法.分享给大家供大家参考,具体如下: 1.下载hibernate jar包:hibernate-release-4.3.5.Final,导入必要的jar包,路径为:hibernate-release-4.3.5.Final\lib\required. 包含的jar包有10个. 2.建立新的java项目. 3.学习自己建立User Library: (a)项目右键--build path--configure build path--add libr

  • Hibernate分页的两种实现方法

    本文实例讲述了Hibernate分页的两种实现方法.分享给大家供大家参考,具体如下: 1. criteria分页 public Page getPage(int currentPage,int pageSize,Criterion...crts){ Criteria c=session.createCriteria(House.class); List list=null; for (int i = 0; i < crts.length; i++) { c.add(crts[i]); } c.s

  • Hibernate延迟加载原理与实现方法

    本文实例讲述了Hibernate延迟加载原理与实现方法.分享给大家供大家参考,具体如下: 为了进一步优化Hibernate的性能,可以使用: 延迟加载技术.管理数据抓取策略.进行缓存管理 等方面考虑来提高Hibernate的性能. 1. 延迟加载(load) 延迟加载(load)是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建. 延迟加载的过程:通过代理(Proxy)机制来实现延迟加载.Hibernate从数据库获取某一个对象数据时.获取某一个对象的集

随机推荐