一直对分页查询有点模糊,最近分析项目源码中的看到一些分页,就想起写个分页的总结了,在网上有很多很好的分页代码,结合了他们的,自己再写了一个。。只是一些基本的操作,在下面例子中用到了,我之前写的总结中的 简化开发-base类(泛型) ,看了以后就会明白这三个类的作用了。
也欢迎大家提出更好的分页代码,好改进和参考。。谢谢。
下面开始例子:
Page.java
import java.util.List;
/**
* 分页Page类
* @author zhxing
*
* @param <T>
*/
public class Page<T>{
public final int DEFAULT_PAGESIZE= 10; // 每页记录数
private List<T> result = null;//页面数据
private int totalRows;//总记录数
private int pageSize=DEFAULT_PAGESIZE;//每页显示行数
private int currentPage;//当前页数
private int totalPages;//总页数
private int startRow;//查询开始的记录数
public Page(){
}
public Page(int totalRows){
//初始化总记录数
this.totalRows=totalRows;
//初始化总页数
this.totalPages=totalRows/pageSize;
if(totalRows%pageSize!=0){
totalPages++;
}
//初始化当前页数
this.currentPage=1;
//初始化查询开始的记录数
this.startRow=0;
}
// 页内的数据列表.
public List<T> getResult() {
return result;
}
public void setResult(List<T> result) {
this.result = result;
}
// 获得上一页
public void previous(){
if(currentPage==1)
return;
currentPage--;
startRow=(currentPage-1)*pageSize;
}
//获得下一页
public void next(){
if(currentPage==totalPages){
return;
}
currentPage++;
startRow=(currentPage+1)*pageSize;
}
public int getCurrentPage() {
return currentPage;
}
//设置当前页
public void setCurrentPage(int currentPage) {
if(currentPage>=totalPages){
if(totalPages==0)
this.currentPage=1;
else
this.currentPage=totalPages;
}
if(1<currentPage&¤tPage<totalPages){
this.currentPage=currentPage;
}
if(currentPage<1){
this.currentPage=1;
}
}
public int getStartRow() {
startRow=(currentPage-1)*pageSize;
return startRow;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public int getTotalPages() {
return totalPages;
}
public int getPageSize() {
return pageSize;
}
public boolean isStart() {
return currentPage==1;
}
public boolean isEnd() {
return currentPage==totalPages||totalPages==0;
}
}
BaseDao.java
import java.io.Serializable;
import java.util.List;
public interface BaseDao<T,ID extends Serializable> {
/**
* 保存实体
* @param entity 实体类
*/
public void save(T entity);
/**
* 删除实体
* @param entity 实体类
*/
public void delete(T entity);
/**
* 根据实体id 删除实体
* @param entityClass 实体类
* @param id 实体id
*/
public void deleteById(Class<T> entityClass,ID id);
/**
* 更新实体
* @param entity 实体类
*/
public void update(T entity);
/**
* 根据实体id 查询单个实体
* @param entityClass 实体类
* @param id 实体id
* @return
*/
public T findById(Class<T> entityClass,ID id);
/**
* 列出所有实体集合
* @param entityClass 实体类
* @return 实体类List
*/
public List<T> findAll(Class<T> entityClass);
/**
* 根据实体参数,查询符合条件的实体类集合
* @param hql
* @param values 参数
* @return
*/
public List<Object> find(String hql, Object... values);
/**
* 根据hql 语句,返回Page 类
* @param page Page类
* @param hql @param hql
* @param currentPage 当前页码
* @return
*/
public Page<T> findByPage(final String hql,final String countHql,final int currentPage);
}
BaseHibernateDao.java
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class BaseHibernateDao<T,ID extends Serializable> extends HibernateDaoSupport implements BaseDao<T,ID> {
@Override
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
}
@Override
public void deleteById(Class<T> entityClass, ID id) {
delete(this.findById(entityClass, id));
}
@Override
public T findById(Class<T> entityClass, ID id) {
return (T)this.getHibernateTemplate().get(entityClass, id);
}
@Override
public List<T> findAll(Class<T> entityClass) {
String name=entityClass.getName();
return this.getHibernateTemplate().find("from"+name);
}
@Override
public void save(T entity) {
this.getHibernateTemplate().save(entity);
}
@Override
public void update(T entity) {
this.getHibernateTemplate().update(entity);
}
@Override
public List<Object> find(String hql, Object... values) {
return this.getHibernateTemplate().find(hql,values);
}
@Override
public Page<T> findByPage(final String hql,final String countHql,final int currentPage) {
// TODO Auto-generated method stub
return (Page<T>)this.getHibernateTemplate().execute(new HibernateCallback(){
@Override
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
//初始化Page
Page<T> page=new Page<T>(getCount(session, countHql));
page.setCurrentPage(currentPage);
//分页查询开始
Query query=session.createQuery(hql);
query.setFirstResult(page.getStartRow());
query.setMaxResults(page.getPageSize());
//把取得的实体list设置到Page 类中
page.setResult(query.list());
return page;
}
//获取总记录数
private int getCount(Session session,String countHql){
Long count=0L;
List list=session.createQuery(countHql).list();
if(list!=null&&list.size()==1)
count=(Long)list.get(0);
return count.intValue();
}
});
}
}
下面网址是有关分页的一些好的文章:
http://www.iteye.com/problems/3652
http://elf8848.iteye.com/blog/355724
http://www.iteye.com/topic/282727
http://www.iteye.com/topic/348531