`

ssh(ssh2) +Dao项目中的分页查询总结

阅读更多

  一直对分页查询有点模糊,最近分析项目源码中的看到一些分页,就想起写个分页的总结了,在网上有很多很好的分页代码,结合了他们的,自己再写了一个。。只是一些基本的操作,在下面例子中用到了,我之前写的总结中的 简化开发-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&&currentPage<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

分享到:
评论

相关推荐

    SSH+模糊查询+分页+增删改查

    在"SSH+模糊查询+分页+增删改查"这个主题中,我们将深入探讨这些关键概念以及它们在实际应用中的结合。 首先,让我们来了解SSH框架的核心组件: 1. **Struts2**:这是一个基于MVC设计模式的开源框架,用于构建动态...

    velocity+ssh2+分页+权限

    总结,"velocity+ssh2+分页+权限"的整合涉及到Web开发中的多个关键环节,包括模板引擎的使用、MVC架构的实现、数据的分页展示以及安全的权限控制。通过这样的整合,开发者可以构建出高效、安全且易于维护的企业级...

    SSH框架+SQLServer实现分页的小项目

    这个"SSH框架+SQLServer实现分页的小项目"提供了一个基础的分页实现示例,适合初学者了解SSH框架如何与数据库交互,以及如何在Java Web应用中实现分页功能。通过研究这个项目,开发者可以学习到SSH框架的整合、...

    SSH+ORACLE好用分页

    2. **创建DAO层**:在数据访问对象(DAO)层,我们需要定义一个方法来执行分页查询。使用Hibernate的Criteria或HQL查询语言,配合PageHelper或者自己实现的分页逻辑,可以轻松实现分页查询。 3. **定义Service层**...

    ssh2+ext+oracle 的项目实例

    在这个项目实例中,EXTJS主要用于创建用户界面,展示数据,以及与后端SSH2进行交互。 项目实例中,EXTJS的GridPanel可能用于显示数据列表,提供分页、排序和过滤功能。FormPanel则用于创建编辑和添加数据的表单,...

    ssh2分页查询

    在这个“ssh2分页查询”项目中,我们将探讨如何在SSH2框架下实现数据库的分页查询功能,这对于处理大量数据的Web应用来说至关重要。 首先,我们需要了解分页查询的基本概念。分页查询是指在从数据库中检索数据时,...

    SSH:Struts2.2+Hibernate3.6+Spring3.1分页示例

    9. **处理分页请求**:Struts2拦截用户的分页请求,根据请求参数更新`UserAction`中的分页信息,重新执行分页查询并渲染新的页面。 通过以上步骤,SSH框架组合可以有效地实现分页功能,同时保持代码的清晰和模块化...

    ssh1整合实例+分页

    2. **调整DAO**:在DAO层,需要根据分页参数(如当前页和每页记录数)动态生成SQL查询,添加LIMIT和OFFSET子句(对于MySQL)或者使用ROWNUM(对于Oracle)来限制返回的记录数量。 3. **修改Service**:在Service层...

    SSH整合CRUD案例+分页功能的实现+教学文档

    2. **修改Service和DAO**:在查询方法中加入分页条件,例如使用HQL(Hibernate查询语言)或Criteria API进行分页查询。 3. **处理结果**:将查询结果转换为分页对象,包含当前页数据和总页数等信息。 4. **在视图中...

    ssh整合下的通用泛型DAO+分页

    在实际项目中,为了实现分页功能,我们需要在DAO层添加额外的查询方法。这通常涉及到使用`HibernateTemplate`的`find()`方法,配合HQL(Hibernate Query Language)或SQL来获取指定范围的结果集。例如: ```java ...

    ssh增删改查+分页

    在SSH2中,我们可以使用JSP标签库,如DisplayTag或SpringTag来实现分页。以DisplayTag为例,你需要在JSP页面中引入DisplayTag库,然后创建一个表格展示数据,并设置分页参数,如每页显示的条目数。在后端,你需要在`...

    ssh框架模板+hibernate简单分页

    SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java Web开发中常见的三大开源框架。这个压缩包文件提供了一个SSH框架模板以及使用Hibernate实现的分页功能的例子代码。 **Struts2** 是一个MVC(Model-View-...

    ssh+baseDao实现分页

    3. **整合Struts**:在Action类中,我们接收用户的请求参数(如页码和每页大小),然后调用Service层的方法,Service层再调用Dao层的分页查询方法。Action将查询结果传递给对应的ActionForm或VO,最后由Struts的...

    ssh2实现查询分页

    在SSH2中,由于Spring的管理,我们通常不直接编写DAO层代码,而是使用Hibernate的Session接口进行操作。在Service层的方法中,已经通过Session进行了查询,所以DAO层在此案例中可以被看作是透明的。 至于页面部分,...

    ssh实现简单的分页查询

    在这个主题中,我们将关注如何在SSH框架下实现简单的分页查询功能。 分页查询是Web应用中常见的需求,它可以有效地减少数据库负载,提高用户体验,尤其是对于数据量庞大的系统。下面将详细介绍SSH框架中实现分页...

    ssh实现分页功能,一个简单的小项目

    2. **创建Service接口和实现**:定义一个包含分页查询方法的Service接口,例如`PageService`,并在实现类中注入DAO并调用其执行分页查询。 3. **实现DAO**:使用Hibernate或JDBC编写分页查询的方法。如果使用...

    SSH+Flex项目

    SSH+Flex项目是一种基于Flex前端和SSH2(Spring、Struts2、Hibernate)后端框架的开发模式,结合MySql数据库,实现了一套完整的Web应用系统。这种模式常用于构建功能丰富的交互式用户界面,同时提供了强大的数据管理...

    SSH的增删改查小例子+分页功能

    在这个"SSH的增删改查小例子+分页功能"中,我们将探讨如何在SSH框架下实现基本的数据操作以及分页功能。 1. **Struts2**:Struts2是MVC(Model-View-Controller)设计模式的实现,负责处理HTTP请求并控制应用的流程...

    SSH 泛型DAO分页

    在实际开发中,"SSH 泛型DAO分页"的整合可能涉及到以下步骤: - 配置SSH框架:包括Struts2的struts.xml、Spring的applicationContext.xml和Hibernate的hibernate.cfg.xml等配置文件。 - 实现泛型DAO:创建泛型接口和...

    ssh分页+ppt说明+源代码

    本压缩包包含的“ssh分页+ppt说明+源代码”资源,显然是为了帮助开发者理解和实现SSH框架下的数据分页功能。 分页是Web应用中常见的一种功能,特别是在数据量大的情况下,它能够提高用户体验,避免一次性加载过多...

Global site tag (gtag.js) - Google Analytics