`

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整合下的通用泛型DAO+分页

    再次打造SSH1整合下的通用泛型DAO+分页,基于HibernateTemplate,欢迎大家指正 - DAO - Java - JavaEye论坛_files

    ssh2实现查询分页

    基于ssh2实现的分页查询,从bean到dao以及service、action,页面。只要复制上去,简单配置一下。就可以实现分页的功能,值得收藏!

    实用SSH分页DAO

    直接导入后 对DAO在spring注入sessionFactory,然后在Action中可以进行简单的调用,测试测试例子都在代码main函数写好了,希望对大家有帮助

    SSH 泛型DAO分页

    Struts2.1.6+Spring2.5.6+Hibernate3.3.2+mysql整合+分页模板 能用

    ssh分页(.dao,.daoImp,.service,.serviceImp,.action,.jsp,applicationContext.xml)

    ssh分页注释加说明借鉴整理的 ssh分页(.dao,.daoImp,.service,.serviceImp,.action,.jsp,applicationContext.xml

    SSH学习基础笔记 .zip

    2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记.pdf 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页)-v笔记.pdf 4-Struts入门笔记.pdf 005_Struts+DAO登陆.pdf 9-Struts高级部分(1)(解决重复提交、上传组件)笔记.pdf 54...

    [code] ssh 分页,自定义标签,查找,泛化dao,中文参数的传递

    NULL 博文链接:https://ap0406708.iteye.com/blog/537709

    MLDN框架笔记大全

    MLDN框架笔记大全 JSP+JDBC_假分页 02 JSP+JDBC_真分页(基于MySQL数据库分页)...试学下载 12 Struts + DAO分页 13 Hibernate入门(上) 14 Hibernate入门(下) 15 Hibernate数据检索(HQL) 试学下载

    SSH整合(登录+增删改查)

    该项目只涉及到两个实体类 Administer 和 Book ,两者之间没什么联系...另外该项目严格按照View-Service-Dao三层,所有对象(包括Action,Service,Dao,SessionFactory、Transaction等对象)都交由Spring容器来创建。

    java底层代码:泛型DAO+SSH+Proxool连接池+国际化语言

    3、此底层包含泛型DAO、Proxool连接池、国际化语言、DateUtil工具、ExcelUtil报表工具、自定义封装的弹框、批量删除、分页、上传等。 4、包含常用的工具:jquery、easy-ui、日期控件、highcharts图表控件、图片放大...

    SSH2分页算法的实现

    struts2+hibernate+spring项目涉及到dao、daoImpl、service、serviceImpl层,这里的分页算法应该执行到每一层。

    ssh分页分层实现

    ssh分页实现,采用依赖注入的方式,分dao,service,action 层实现

    ssh2框架带有分页tomcat

    tomcat ssh2 分页复制写个sql就能用 dao是写好的

    SSH 项目的分页类

    SSH可以直接拿来用的java类;在Dao实现接口里边,要定义一个开始的参数1;以1为开始的首页;

    ssh框架搭建实例源码3

    本资源是在“ssh框架搭建实例源码2”基础上修改了分页技术,实现项目真正可用的分页技术;实现对基础的dao,service,action操作的提取封装;使命名更规范。本资源所需的jar包请到“ssh框架搭建实例源码2”和“ssh...

    使用Annotation并对DAO层封装具有分页功能的S2SH整合实例_好资源0分送

    个人认为由Sun官方支持的EJB规范会越来越流行,此时如果使用基于Annotation的SSH框架很容易转移到Struts+EJB+Spring的项目中,而且使用Annotation,很容易实现0配置,像在这个实例中就一个配置,这样避免了配置文件...

    java大作业基于SSH框架的学生成绩管理系统源码.zip

    java基于SSH框架的学生成绩管理系统源码。要求: (1) 整合Struts2、Spring和Hibernate框架...​ (3) 在Spring配置文件中增加该DAO层实现类的定义,并需要依赖注入一个SessionFactory bean的引用。 7、 开发Service

    ssh对数据库增删改查,全选删除,分页

    ssh对数据库增删改查,全选删除,单个删除,分页

    ssh框架搭建实例源码4

    本资源所需的jar包请到“ssh框架搭建实例源码2”和“ssh框架搭建实例源码”中下载: http://download.csdn.net/detail/linchengzhi/4100204 http://download.csdn.net/download/linchengzhi/4076267 相关链接: ...

    SSH整合(struts2+hibernate+spring)

    用SSH做的简易论坛系统,功能算丰富,CRUD,分页,表关联,完全可以做毕业设计,导入即可运行,数据库用的是oracle,前台使用了jquery,登录,注册都是弹出层。开始先要对板块插入数据,表可以用hibernate的自动创建...

Global site tag (gtag.js) - Google Analytics