一、准备工作
1.打开oracle数据库,登录scott账户,查询emp表的所有记录、总记录数
2.打开MyEclipse,创建一个Java项目:hibernate_page,创建包,添加oracle数据库连接,添加hibernate配置文件,添加scott账户emp,dept表的hibernate映射文件及映射类。
3.创建TestPage.java测试类,测试hibernate分页查询。
public class TestPage {
public static void main(String[] args) {
// t1();//通过分页类分页查询
t2();//直接在hibernate中分页查询
}
}
二、开始测试
(1)1.通过创建一个泛型类Pager<T>,这是分页的公共类
package com.svse;
import java.util.List;
/**
* 新建一个泛型类Pager<T>,这是分页的公共类 <br/>
*
* @author Administrator
* 分页 <br/>
* firstIndex 首记录索引 = (pageNo - 1) * pageSize <br/>
* pageNo 当前页号 <br/>
* pageSize 页面大小 <br/>
* totalRecordCount 总记录数 = select count(*) from 表名 <br/>
* totalPageCount 总页数 = <br/>
* 算法1: if( totalRecourdCount % pageSize == 0 ){ <br/>
* totalPageCount = totalRecourdCount / pageSize; <br/>
* }else{ <br/>
* totalPageCount = totalRecourdCount / pageSize + 1; <br/>
* } <br/>
*
* 算法2: totalPageCount = (totalRecourdCount - 1) / pageSize + 1; <br/>
* @param <T>
*/
public class Pager<T> {
private int firstIndex;// 首记录索引
private int pageNo;// 当前页号
private int pageSize;// 页面大小
private int totalRecordCount;// 总记录数
private int totalPageCount;// 总页数
private List<T> list;// list容器,接收数据
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
/**
* firstIndex只要get方法,不要set方法
*
* @return
*/
public int getFirstIndex() {
// 首记录索引 = (当前页号 - 1)*页面大小
return firstIndex = (this.getPageNo() - 1) * this.getPageSize();
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRecordCount() {
return totalRecordCount;
}
public void setTotalRecordCount(int totalRecordCount) {
this.totalRecordCount = totalRecordCount;
}
/**
* totalPageCount只要get方法,不要set方法
*
* @return
*/
public int getTotalPageCount() {
// 总页数 = (总记录数 - 1)/页面大小 + 1
return totalPageCount = (this.getTotalRecordCount() - 1)
/ this.getPageSize() + 1;
}
}
2.再到测试类TestPage的主方法中编写测试方法,并调用这个类,来实现分页查询
/**
* 通过分页类分页查询
*/
private static void t1() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
//查询emp表的所有内容
Query query = session.createQuery("FROM Emp");
//将Emp填充到Pager<T>泛型类中
Pager<Emp> pager = new Pager<Emp>();
pager.setPageNo(2);//当前页号
pager.setPageSize(5);//页面大小
query.setFirstResult(pager.getFirstIndex());//获取首记录索引
query.setMaxResults(pager.getPageSize());//获取页面大小
List<Emp> list = query.list();
for(Emp e : list){
/*
* e.getDept()获得的是一个地址
* e.getDept().getDeptno()获得的才是真正的部门编号
* */
System.out.println(e.getEmpno()+"\t\t"+e.getEname()+"\t\t"+e.getJob()+"\t\t"
+e.getMgr()+"\t\t"+e.getHiredate()+"\t\t"
+e.getSal()+"\t\t"+e.getComm()+"\t\t"+e.getDept().getDeptno());
}
transaction.commit();
session.close();
sessionFactory.close();
}
首先是e.getDept(),获取部门
再将e.getDept()改为e.getDept().getDeptno().
(2)直接在hibernate中分页查询
/**
* 直接在hibernate中分页查询
*/
private static void t2() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("FROM Emp");
//查询emp表中的总记录数countHQL
String countHQL = "SELECT count(*) FROM Emp";
//计算总记录数count
int count = ((Long) session.createQuery(countHQL).uniqueResult()).intValue();
//设置页面大小pageSize
int pageSize = 5;
//计算总页数totalPageCount
int totalPageCount = (count%pageSize == 0)?(count/pageSize):(count/pageSize + 1);
//设置当前页码pageNo
int pageNo = 1;
query.setFirstResult((pageNo - 1)*pageSize);//获取首记录索引
query.setMaxResults(pageSize);//获取页面大小
List<Emp> list = query.list();
for(Emp e : list){
/*
* e.getDept()获得的是一个地址
* e.getDept().getDeptno()获得的才是真正的部门编号
* */
System.out.println(e.getEmpno()+"\t\t"+e.getEname()+"\t\t"+e.getJob()+"\t\t"
+e.getMgr()+"\t\t"+e.getHiredate()+"\t\t"
+e.getSal()+"\t\t"+e.getComm()+"\t\t"+e.getDept().getDeptno());
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行结果为:
关键的地方在:
query.setFirstResult((pageNo - 1)*pageSize);//获取首记录索引
query.setMaxResults(pageSize);//获取页面大小
要记住这两个set方法。
好了,在hibernate中分页查询就完成了。^_^