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

这篇文章主要介绍了Hibernate框架数据分页技术,结合实例形式分析了Hibernate框架实现数据分页的原理,步骤与相关实现技巧,需要的朋友可以参考下

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

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

(1)确定记录跨度,即确定每页显示的记录条数,可根据实际情况而定。

(2)获取记录总数,即获取显示页面中的总记录数,其目的是根据该数来确定总的分布数。

(3)确定分页后的总页数。可根据公式:“总页数=(总记录数 - 1) / 每页显示的记录数 + 1”。

(4)根据当前页数显示数据。如果该页数小于1,则使其等于1;如果大于最大页数,则使其等于最大页数。

(5)通过For、While循环语句分布显示查询结果。

2.获取前n条记录:

sql语法:

SELECT TOP n FROM table WHERE ... ORDERBY ...

例如:获取前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

6.5index.jsp程序清单:

My JSP 'index.jsp' starting page

车辆信息分页显示

车牌号

车辆名称

品牌

发动机编号

" + car.getId() + "" + "" + car.getName() + "" + "" + car.getBrand() + "" + "" + car.getEngineNum() + ""); } int all = paginationUtil.allPage(3); %>

共页,当前页是第页 1) { %> 下一页

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

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

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...