`
sky_dream
  • 浏览: 6298 次
  • 性别: Icon_minigender_1
  • 来自:
最近访客 更多访客>>
社区版块
存档分类
最新评论

基于SSH的DAO类设计

阅读更多

     今天把以前使用的的DAO层操作整理了下,包括分页,由于以前项目比较近,没有成为一个独立可复用的模块,整理后基本满足了可复用需求。

     由于经验不足,DAO层设计比较单一,希望论坛里的大虾们,共同对此DAO修改,如果你的修改可以是DAO层更灵活,我将十分感谢,此DAO是由robin和HTT的思想和自己工作中的经验而成,再次感谢他们。

 

DAO顶级接口类:IBaseDao.java

package com.frame.ssh.dao.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.frame.ssh.util.PagesBean;
import com.sun.istack.internal.FinalArrayList;

	/**
	 *  Dao的顶级接口,为基本的操作提供接口
	 *  
	 *  
	 * @author zjc
	 * @version 1.0
	 * @since 1.0
	 */
public interface IBaseDao<T,ID extends Serializable> {
	
		/**
		 * 添加实体类
		 * 
		 * @param entity:需要添加的实体类
		 * @return 无返回值
		 * */
	Serializable  saveEntity(final T entity);
	 
	/**
	 * 添加修改实体类
	 * 
	 * @param entity:需要添加的实体类
	 * @return 无返回值
	 * */
	void  saveOrUpdateEntity(final T entity);
	 /**
		 * 修改实体类
		 * 
		 * @param entity:修改持久化的对象
		 * @return 实现序列化的对象
		 * */
	 Serializable  updateEntity(final T entity);
	 
	 /**
		 * 删除持久化实体类
		 * 
		 * @param entity:删除持久化的对象
		 * @return 实现序列化的对象
		 * */
	 void  deleteEntity(final T entity);
	 
	 /**
		 * 查询单个实体对象
		 * 
		 * @param clazz:查询实体的CLASS
		 * @param id:查询实体的标示符
		 * @return 实体对象
		 * */
	 T   getEntity(final Class<T> clazz,final ID id);
	 
	 /**
		 * 通过主键查询实体类
		 * 
		 * @param id:查询实体的标示符
		 * @return 实体对象
		 * */
	 T  getEntityByID(final ID id);
	 
	 /**
		 * 无分页查询所有的对象集合
		 * 
		 * @param conditionMap:查询条件集合
		 * @return 实体对象集合
		 * */
	 List<T>   findEntity(final Map<ID,T> conditionMap);
	 
	 /**
		 * 查询所有对象
		 * 
		 * @param conditionMap:查询条件集合
		 * @return 实体对象集合
		 * */
	 List<T>   findAllEntity(final Class<T> clazz);
	 
	 /**
		 * 带分页的查询方法,基于HQL
		 * 
		 * @param entity:实体类
		 * @return 实体对象集合
		 * */
	 PagesBean<T>   findEntityByPageHQL(final T entity,final PagesBean<T>  page,final String HQL,final String condHQL);
	 
	 /**
		 * 带分页的查询方法,基于SQL
		 * 
		 * @param entity:实体类
		 * @return 实体对象集合
		 * */
	 PagesBean<T>  findEntityByPageSQL(final T entity,final PagesBean<T>  page,final String SQL,final String condSQL);
	 
}

 

抽象类:AbstractBaseDaoImplement.java

package com.frame.ssh.dao.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.orm.hibernate3.HibernateTemplate;

import com.frame.ssh.util.PagesBean;


/**
 * Spring 集成 Hibernate DAO 的抽象类,通过IOC将SessionFactory注入. 基本操作功能实现.
 * 
 * @author zjc
 * @version 1.0
 * @since 1.0
 */
public abstract class AbstractBaseDaoImplement<T, ID extends Serializable> extends AbstractDividePage<T> implements IBaseDao<T, ID> {

	private HibernateTemplate hibernateTemplate;
	
	 abstract Class<T> getEntityClazz();
	 
	HibernateTemplate getHibernateTemplate() {
		
		return hibernateTemplate;
		
	}
	
	@Override
	public  void deleteEntity(final T entity) {
		
			hibernateTemplate.delete(entity);
			
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<T> findEntity(Map<ID, T> conditionMap) {
		
		StringBuffer  HQL = new  StringBuffer();
		HQL.append(" from "+getEntityClazz().getSimpleName());
		HQL.append(" where 1=1 ");
		
		if(conditionMap instanceof Map<?,?> && conditionMap.size()>0){
			
			for (ID id : conditionMap.keySet()) {
				HQL.append(" and").append(id).append(conditionMap.get(id));
			}

		}else{
			
			throw new IllegalArgumentException();
			
		}
		return hibernateTemplate.find(HQL.toString());
	}

	@SuppressWarnings("unchecked")
	@Override
	public T getEntity(Class<T> clazz, ID id) {
		
		return (T) hibernateTemplate.load(clazz, id);
		
	}
	
	@Override
	public Serializable saveEntity(T entity) {
		
		return hibernateTemplate.save(entity);
		
	}
	
	
	@SuppressWarnings("unchecked")
	@Override
	public T getEntityByID(ID id) {
		
		return (T) hibernateTemplate.load(getEntityClazz(), id);
		
	}
	
	@Override
	public Serializable updateEntity(T entity) {
		
		return (Serializable) hibernateTemplate.merge(entity);
		
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<T> findAllEntity(Class<T> clazz) {
		
		return hibernateTemplate.loadAll(clazz);
		
	}
	
	@Override
	public void saveOrUpdateEntity(T entity) {
		
		 hibernateTemplate.saveOrUpdate(entity);
		 
	}

	@Override 
	public PagesBean<T> findEntityByPageHQL(T entity, PagesBean<T> page,String HQL,String condHQL) {
		
		return super.dividePageOperation(entity, page, HQL, condHQL);
		
	}
	
	@Override
	public PagesBean<T> findEntityByPageSQL(T entity, PagesBean<T> page,String SQL, String condSQL) {
		
		return super.dividePageOperationSQL(entity, page, SQL, condSQL);
		
	}

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		
		this.hibernateTemplate = hibernateTemplate;
		
	}

}

 

 分页抽象类:AbstractDividePage.java

package com.frame.ssh.dao.base;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.frame.ssh.util.PagesBean;
/**
 * 分页抽象类,提供HQL、SQL两种方式.
 * 
 * @author zjc
 * @version 1.0
 * @since 1.0
 */
public abstract class AbstractDividePage<T> {
	
	
	private static int  TOTAL_COUNT = 0;					// 总记录数
	private static int BEGIN_INDEX = 0;						// 起始位置
	private static int TOTAL_PAGE = 0;						// 总页数
	private static int PAGE_COUNT = 0;						// 每页记录数
	private static int  CURRENT_PAGE= 0;					// 当前第几页
	private PagesBean<T> pageBean;
	
	abstract HibernateTemplate  getHibernateTemplate();
	
	/**
	 * 基于HQL的分页方法
	 * @param entity 实体分页对象
	 * @param page 分页类
	 * @return 分页后的对象
	 * */
	@SuppressWarnings("unchecked")
	PagesBean<T>   dividePageOperation(T entity,PagesBean<T>  page,final String HQL,String condHQL) {
		
		if(entity == null || page == null || HQL == null || condHQL == null){
			throw new IllegalArgumentException("传入参数为空!");
			
		}
		
		
		TOTAL_COUNT = ((Long) this.getHibernateTemplate().find(condHQL).iterator().next()).intValue();
		BEGIN_INDEX = PagesBean.getIndex(page.getPageSize(), page.getCurrentPage());
		TOTAL_PAGE = PagesBean.countTotalPage(page.getPageSize(), page.getTotalCount());
		CURRENT_PAGE = PagesBean.countCurrentPage(page.getCurrentPage());
		PAGE_COUNT = page.getPageSize();
		
		
		 pageBean = new PagesBean<T>();
		 pageBean.setTotalCount(TOTAL_COUNT);
		 pageBean.setCurrentPage(CURRENT_PAGE);
		 pageBean.setPageSize(PAGE_COUNT);
		 pageBean.setTotalPage(TOTAL_PAGE);
		 pageBean.setUrl(page.getUrl());
		
		List<T> list = this.getHibernateTemplate().executeFind(new HibernateCallback() {
			
			public Object doInHibernate(Session session) throws HibernateException,	SQLException {
				return session.createQuery(HQL).setFirstResult(BEGIN_INDEX).setMaxResults(PAGE_COUNT);
			}
		});
		
		pageBean.setList(list);
		return pageBean;
	}
	
	/**
	 * 基于HQL的分页方法
	 * @param entity 实体分页对象
	 * @param page 分页类
	 * @return 分页后的对象
	 * */
	@SuppressWarnings("unchecked")
	PagesBean<T>   dividePageOperationSQL(T entity,PagesBean<T>  page,final String SQL,final String condSQL) {
		
		if(entity == null || page == null || SQL == null || condSQL == null){
			throw new IllegalArgumentException("传入参数为空!");
			
		}
		
		Object object = this.getHibernateTemplate().execute(new HibernateCallback() {
			@Override
			public Object doInHibernate(Session session) throws HibernateException,SQLException {
				return session.createSQLQuery(condSQL).uniqueResult();
			}
		});
		
		
		TOTAL_COUNT = Integer.valueOf(object.toString());
		BEGIN_INDEX = PagesBean.getIndex(page.getPageSize(), page.getCurrentPage());
		TOTAL_PAGE = PagesBean.countTotalPage(page.getPageSize(), page.getTotalCount());
		CURRENT_PAGE = PagesBean.countCurrentPage(page.getCurrentPage());
		PAGE_COUNT = page.getPageSize();
		
		
		 pageBean = new PagesBean<T>();
		 pageBean.setTotalCount(TOTAL_COUNT);
		 pageBean.setCurrentPage(CURRENT_PAGE);
		 pageBean.setPageSize(PAGE_COUNT);
		 pageBean.setTotalPage(TOTAL_PAGE);
		 pageBean.setUrl(page.getUrl());
		
		List<T> list = this.getHibernateTemplate().executeFind(new HibernateCallback() {
			
			public Object doInHibernate(Session session) throws HibernateException,	SQLException {
				return session.createSQLQuery(SQL).setFirstResult(BEGIN_INDEX).setMaxResults(PAGE_COUNT);
			}
		});
		pageBean.setList(list);
		return pageBean;
	}
	

}

 

分页基本类:PagesBean.java

package com.frame.ssh.util;

import java.util.List;

/**
 * 分页基本类
 * 
 * @author zjc
 * @version 1.0
 * @since 1.0
 */
public final class PagesBean<T> {
	
	private int totalCount;     
	private int pageSize;       
    private int currentPage;    
    private int totalPage;      
    private List<T> list;
    private String url;
    
    private String key;
    private String value;

    private String remark;
    private String remark1;
    private String remark2;
    
	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public List<T> getList() {
		return list;
	}

	public void setList(List<T> list) {
		this.list = list;
	}

	/**
     * 计算总页数
     * @param pageSize 每页记录数
     * @param totalCount 总记录数
     * @return 总页数
     */
    public static int countTotalPage(final int pageSize,final int totalCount){
        int totalPage = totalCount % pageSize == 0 ? totalCount/pageSize : totalCount/pageSize+1;
        return totalPage;
    }
    
    /** 
     * 计算当前页开始记录
     * @param pageSize 每页记录数
     * @param currentPage 当前第几页
     * @return 当前页开始记录号
     */
    public static int getIndex(final int pageSize,final int currentPage){
        final int startCount = pageSize*(currentPage-1);
        return startCount;
    }
    
    /**
     * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
     * @param page 传入的参数(可能为空,即0,则返回1)
     * @return 当前页
     */
    public static int countCurrentPage(int page){
        final int curPage = (page==0?1:page);
        return curPage;
    }

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}

	public int getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}

	public int getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getRemark1() {
		return remark1;
	}

	public void setRemark1(String remark1) {
		this.remark1 = remark1;
	}

	public String getRemark2() {
		return remark2;
	}

	public void setRemark2(String remark2) {
		this.remark2 = remark2;
	}

	
}

 

 再次希望大家对此提出你宝贵意见,我将非常感谢。

分享到:
评论

相关推荐

    SSH中通用dao类

    总结来说,"SSH中通用DAO类"是基于SSH框架设计的可复用数据访问组件,它利用Spring的DAO支持和Hibernate的ORM能力,提供了一套标准的数据库操作接口和实现,以满足多种业务需求。在实际开发中,这样的DAO设计有助于...

    基于SSH的论坛系统

    《基于SSH的论坛系统详解》 SSH(Struts + Spring + Hibernate)是Java Web开发中的经典框架组合,常用于构建高效、稳定的企业级应用。在本篇中,我们将深入探讨如何利用这三大框架构建一个基于SSH的论坛系统,以及...

    java课程设计基于SSH的课程设计管理系统 (2).zip

    Java课程设计基于SSH的课程设计管理系统是一个典型的Web应用程序开发项目,使用了Struts、Spring和Hibernate这三大流行框架的组合,通常称为SSH框架。SSH框架是Java Web开发中的一个重要工具,它极大地简化了企业级...

    基于SSH框架的房屋租赁系统

    【基于SSH框架的房屋租赁系统】是一个典型的Java Web应用程序,它利用了Struts2、Spring和Hibernate这三大开源框架的组合,以实现高效且模块化的后端开发。SSH框架是Java开发领域中广泛采用的技术栈,它能帮助开发者...

    基于SSH框架的员工管理系统

    总结来说,"基于SSH框架的员工管理系统"是一个利用Struts2处理Web请求,Spring管理业务逻辑和对象依赖,Hibernate负责数据库操作的Java Web项目。它为企业级应用开发提供了强大而稳定的支撑,实现了对员工信息的有效...

    基于SSH的学生选课系统

    【基于SSH的学生选课系统】是一个使用SSH(Struts2 + Spring + Hibernate)技术栈构建的JavaEE应用程序,主要用于实现高校学生选课的功能。SSH框架是Java Web开发中常用的一套整合框架,它结合了Struts2的MVC设计...

    基于ssh的购物系统

    SSH(Struts + Spring + Hibernate)是一种经典的Java Web开发框架组合,广泛应用于企业级应用,特别是电子商务领域,如本项目“基于SSH的购物系统”。这个系统利用SSH的优势,实现了高效、稳定且功能丰富的购物平台...

    基于ssh框架开发的在线考试系统

    【基于SSH框架开发的在线考试系统】是一种使用Java技术栈,结合Struts、Spring和Hibernate三个开源框架构建的Web应用程序。SSH是这三个框架首字母的缩写,它们分别是:Struts(表示MVC架构的Action层)、Spring...

    基于ssh框架的网上电器商场

    【基于SSH框架的网上电器商场】是一个典型的Java Web项目,SSH是Struts2、Spring和Hibernate三个开源框架的缩写,它们共同构建了一个强大的MVC(Model-View-Controller)架构,用于开发复杂的Web应用程序。...

    基于ssh客房信息管理系统

    在这个基于SSH的客房信息管理系统中,这三个框架协同工作,实现了对客房数据的有效管理和交互。 1. **Struts2**:作为MVC(模型-视图-控制器)架构的一部分,Struts2负责处理HTTP请求,并将这些请求映射到相应的...

    基于SSH+MySQL的学生成绩管理系统

    【基于SSH+MySQL的学生成绩管理系统】是一个典型的Java Web应用程序,它利用Struts2(S)、Spring(S)和Hibernate(H)三大框架构建,同时结合MySQL数据库进行数据存储和管理。SSH框架是Java领域中广泛使用的MVC...

    基于SSH商场管理系统

    **基于SSH商场管理系统详解** SSH(Struts2 + Spring + Hibernate)是一个常见的Java Web开发框架组合,被广泛用于构建高效、稳定的企业级应用,如商场管理系统。SSH框架结合了Struts2的MVC设计模式、Spring的依赖...

    基于ssh的增删查改

    综上所述,基于SSH框架的人力资源管理系统增删查改功能的实现,涉及了从开发环境搭建、数据库设计、实体类与映射文件创建、DAO层设计与实现、业务逻辑处理到控制器层响应等多个环节。这一过程不仅体现了SSH框架的...

    基于SSH学生成绩管理系统.rar

    **基于SSH学生成绩管理系统** SSH(Struts2 + Spring + Hibernate)是一个经典的Java Web开发框架,用于构建高效、可扩展的企业级应用。这个“基于SSH学生成绩管理系统”是利用这三个技术栈来实现的一个教育领域的...

    基于SSH框架旅游信息管理系统

    【基于SSH框架旅游信息管理系统】是一个综合性的应用项目,它结合了Struts、Spring和Hibernate这三个主流的Java Web开发框架,旨在实现一个高效、稳定且功能完善的旅游信息管理平台。SSH框架是Java社区中广泛使用的...

    基于SSH招聘管理系统设计源代码

    综上所述,这个【基于SSH招聘管理系统设计源代码】项目涵盖了Web应用开发的多个核心领域,包括前端交互、后端业务逻辑、数据持久化以及数据分析可视化。它提供了一套完整的招聘流程管理解决方案,对于学习SSH框架、...

    毕业设计 基于SSH框架的网上客车售票系统

    【标题】"基于SSH框架的网上客车售票系统"是一个典型的Web应用开发项目,它利用了Struts、Spring和Hibernate这三大主流开源框架的集成,即我们常说的SSH框架。SSH框架在Java Web开发中有着广泛的应用,因其强大的...

    基于SSH的增删改查程序

    标题"基于SSH的增删改查程序"表明这是一个使用SSH框架实现的基础CRUD(Create, Read, Update, Delete)功能的项目。对于初学者来说,这是一个很好的起点,因为它涵盖了Web应用开发的基本操作。 在SSH框架中,Struts...

    基于SSH的OA系统

    【基于SSH的OA系统】是一种基于Struts2、Spring和Hibernate三大开源框架集成开发的办公自动化(Office Automation,简称OA)系统。这个系统为开发者提供了一个基础平台,可以在其上进行二次开发,以满足不同企业对OA...

    基于SSH图书管理系统

    **基于SSH图书管理系统详解** SSH(Struts+Spring+Hibernate)是Java开发中常见的Web应用程序框架,用于构建高效、可扩展的企业级应用。本系统是一个适用于初学者实践SSH框架的图书管理系统,它集成了JSP(Java...

Global site tag (gtag.js) - Google Analytics