读书人

基于SSH的DAO种设计

发布时间: 2012-10-07 17:28:51 作者: rapoo

基于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;}@Overridepublic  void deleteEntity(final T entity) {hibernateTemplate.delete(entity);}@SuppressWarnings("unchecked")@Overridepublic 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")@Overridepublic T getEntity(Class<T> clazz, ID id) {return (T) hibernateTemplate.load(clazz, id);}@Overridepublic Serializable saveEntity(T entity) {return hibernateTemplate.save(entity);}@SuppressWarnings("unchecked")@Overridepublic T getEntityByID(ID id) {return (T) hibernateTemplate.load(getEntityClazz(), id);}@Overridepublic Serializable updateEntity(T entity) {return (Serializable) hibernateTemplate.merge(entity);}@SuppressWarnings("unchecked")@Overridepublic List<T> findAllEntity(Class<T> clazz) {return hibernateTemplate.loadAll(clazz);}@Overridepublic 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);}@Overridepublic 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() {@Overridepublic 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;}}

?

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

读书人网 >软件架构设计

热点推荐