首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

泛型dao架构兑现,封装crud等基本操作

2012-11-01 
泛型dao架构实现,封装crud等基本操作今天闲着没事,根据公司的框架中的程序架构进行了修改增加了泛型实现 ?

泛型dao架构实现,封装crud等基本操作

今天闲着没事,根据公司的框架中的程序架构进行了修改增加了泛型实现

?

其中包括4个基类 BaseDao.java, BaseDAOHibernate.java,BaseManager.java,BaseManagerImpl.java

?

1. dao接口基类

?

/** * BaseDAO.java * * */package com.easou.ad.dao;import java.util.HashMap;import java.util.List;public interface BaseDAO<E> {    /**     * 根据主键获得实体     *      * @param id 实体主键     * @return BaseEntity     */    E getEntity(Long id);    /**     * 获得所有实体     *      * @return List     */    List<E> getAllEntity();    /**     * 保存实体     *      * @param entity pojo instance     */    void saveEntity(E entity);    /**     * 根据主键删除实体     *      * @param id 实体主键     */    void removeEntity(Long id);    public List<E> search(HashMap con ,int page,int rowsPerPage);public List<E> search(HashMap con);}

?

2. dao实现类

?

/** * BaseDAOHibernate.java * *Copyright 2007 easou, Inc. All Rights Reserved. */package com.easou.ad.dao.hibernate;import java.lang.reflect.ParameterizedType;import java.util.List;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.easou.framework.util.PageList;import com.easou.ad.dao.BaseDAO;public abstract class BaseDAOHibernate<E> extends HibernateDaoSupport implements        BaseDAO<E> {    protected final Log log = LogFactory.getLog(this.getClass().getName());    protected Class<E> clazz;     public BaseDAOHibernate() {             this.clazz =(Class<E>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];         }    /**     * 根据主键获得实体     *      * @param id 实体主键     * @return 实体对象     */    @SuppressWarnings("unchecked")public final E getEntity(final Long id) {        return (E)getHibernateTemplate().get(clazz, id);    }    /**     * 获得所有实体     *      * @return List     */    @SuppressWarnings("unchecked")    public final List<E> getAllEntity() {        PageList result = new PageList();        List l = getHibernateTemplate().loadAll(clazz);        result.addAll(l);        result.setCurrentPage(1);        result.setPageCount(1);        result.setTotalRowCount(l.size());        return result;    }    /**     * 保存实体     *      * @param entity 实体对象     */    public final void saveEntity(final E entity) {             getHibernateTemplate().saveOrUpdate(entity);    }    /**     * 根据主键删除实体     *      * @param id 实体主键     */    public final void removeEntity(final Long id) {        Object o = getEntity(id);        if (null != o) {            getHibernateTemplate().delete(o);        }    }    /**     * 执行批量更新和删除操作的HQL     *      * @param sql hql语句     * @return PageList     */    @SuppressWarnings("unchecked")protected final List<E> executeHQL(final String sql) {        Session session = null;        List<E> ret = null;        try {        log.info(sql);            session = this.getSession();            if (sql.toUpperCase().startsWith("DELETE")                    || sql.toUpperCase().startsWith("UPDATE")) {                session.createQuery(sql).executeUpdate();            } else {                ret = session.createQuery(sql).list();            }        } catch (HibernateException e) {            log.error("executeHQL() error:" + sql, e);            throw convertHibernateAccessException(e);        } finally {            this.releaseSession(session);        }        return ret;    }    /**     * 执行分页查询     *      * @param selectField HQL语句中,SELECT 的内容(如果设置了此参数值,则sql参数中不可带SELCT语句部分)     * @param countField HQL语句中,count 的内容     * @param sql HQL语句     * @param page 第几页     * @param rowsPerPage 每页记录数     * @return PageList     */    @SuppressWarnings("unchecked")protected final List<E> pageListQuery(final String selectField,            String countField, String sql, int page, int rowsPerPage) {        PageList result = new PageList();        Session session = null;        try {            session = this.getSession();            // 预留count的sql语句            String countSql = sql.substring(sql.toUpperCase().indexOf("FROM"));            // 设置返回的列,进行查询            if (null != selectField) {                sql = "SELECT " + selectField + sql;            }            if (page <= 0) {                page = 1; // page最小为1            }            log.debug("query sql:" + sql);            Query q = session.createQuery(sql);            if (rowsPerPage > 0) { // rowsPerPage的值是0或-1时,都返回全部结果集                q.setFirstResult(rowsPerPage * (page - 1));                q.setMaxResults(rowsPerPage);            }            result.addAll(q.list());            // 设置分页查询的列            if (null == countField) {                countField = "*";            }            int rowsCount = result.size();            if (rowsPerPage > 1 && rowsCount > 0) {                // 每页记录数大于1且结果集大于0才计算分页信息,否则当前页记录数就作为总的记录数                // TODO 解决page值过大,可能导致rowsCount为0的问题                countSql = "select count(" + countField + ") " + countSql;                // 计算总记录数时,消除 Order by语句,提高性能                int oPos = countSql.toUpperCase().indexOf("ORDER BY");                if (oPos > 0) {                    countSql = countSql.substring(0, oPos);                }                rowsCount = ((Integer) session.createQuery(countSql).iterate().next()).intValue();            }            if (0 == rowsCount) {                page = 0;            }            if (rowsPerPage < 0) {                page = 1;                rowsPerPage = rowsCount;            }            result.setCurrentPage(page);            result.setTotalRowCount(rowsCount);            result.calcPageCount(rowsPerPage);        } catch (HibernateException e) {            log.error("pageListQuery() error:" + sql, e);            throw convertHibernateAccessException(e);        } finally {            this.releaseSession(session);        }        return result;    }    /**     * 执行分页查询     *      * @param selectField HQL语句中,SELECT 的内容(如果设置了此参数值,则sql参数中不可带SELCT语句部分)     * @param sql HQL语句     * @param page 第几页     * @param rowsPerPage 每页记录数     * @param totalRowCount HQL语句获得的总记录数     * @return PageList     */    @SuppressWarnings("unchecked")    protected final PageList pageListQuery(final String selectField,            String sql, int page, int rowsPerPage, final int totalRowCount) {        PageList result = new PageList();        Session session = null;        try {            session = this.getSession();            // 设置返回的列,进行查询            if (null != selectField) {                sql = "SELECT " + selectField + sql;            }            if (page <= 0) {                page = 1; // page最小为1            }            Query q = session.createQuery(sql);            if (rowsPerPage > 0) { // rowsPerPage的值是0或-1时,都返回全部结果集                q.setFirstResult(rowsPerPage * (page - 1));                q.setMaxResults(rowsPerPage);            }            result.addAll(q.list());            if (0 == totalRowCount) {                page = 0;            }            if (rowsPerPage < 0) {                page = 1;                rowsPerPage = totalRowCount;            }            result.setCurrentPage(page);            result.setTotalRowCount(totalRowCount);            result.calcPageCount(rowsPerPage);        } catch (HibernateException e) {            log.error("pageListQuery() error:" + sql, e);            throw convertHibernateAccessException(e);        } finally {            this.releaseSession(session);        }        return result;    }    /**     * 执行分页查询     *      * @param sql HQL语句     * @param page 第几页     * @param rowsPerPage 每页记录数     * @param totalRowCount HQL语句获得的总记录数     * @return PageList     */    protected final PageList pageListQuery(final String sql, final int page,            final int rowsPerPage, final int totalRowCount) {        return pageListQuery(null, sql, page, rowsPerPage, totalRowCount);    }    /**     * 执行分页查询     *      * @param sql HQL语句     * @param rowsPerPage 每页记录数     * @param page 第几页     * @return PageList     * @throws HibernateException hibernate 异常     */    protected List<E> pageListQuery(final String sql, final int page,            final int rowsPerPage) throws HibernateException {        return pageListQuery(null, null, sql, page, rowsPerPage);    }    /**     * 执行分页查询     *      * @param countField HQL语句中,count 的内容     * @param sql HQL语句     * @param rowsPerPage 每页记录数     * @param page 第几页     * @return PageList     * @throws HibernateException hibernate 异常     */    protected List pageListQuery(final String countField, final String sql,            final int page, final int rowsPerPage) throws HibernateException {        return pageListQuery(null, countField, sql, page, rowsPerPage);    }    /**     * 计算HQL查询的返回记录数     *      * @param sql 查询语句     * @param countField count语句操作的字段     * @return 记录数     */    protected int countHQL(String sql, String countField) {        int rowsCount = 0;        Session session = null;        try {            session = this.getSession();            if (null == countField) {                countField = "*";            }            sql = "select count(" + countField + ") " + sql;            rowsCount = ((Integer) session.createQuery(sql).iterate().next())                    .intValue();        } catch (HibernateException e) {            log.error("countHQL() error:" + sql, e);            throw convertHibernateAccessException(e);        } finally {            this.releaseSession(session);        }        return rowsCount;    }    /**     * 计算HQL查询的返回记录数     *      * @param sql 查询语句     * @return 记录数     */    protected int countHQL(String sql) {        return countHQL(sql, null);    }}

?

3. 业务逻辑基类接口

?

/** * BaseManager.java * * Copyright 2007 easou, Inc. All Rights Reserved. */package com.easou.ad.bl;import java.util.HashMap;import java.util.List;/** * TODO 业务逻辑基类接口 *  * Revision History *  *  */public interface BaseManager<E> {    /**     * 根据主键获得实体     *      * @param id 主键id     * @return BaseEntity     */    E get(Long id);    /**     * 获得所有实体     *      * @return List     */    List<E> getAll();    /**     * 保存实体     *      * @param entity pojo instance     */    void save(E entity);    /**     * 根据主键删除实体     *      * @param id 实体主键     */    void remove(Long id);    /**     * 分页搜索     * @param con     * @param page     * @param rowsPerPage     * @return     */    public List<E> search(HashMap con ,int page,int rowsPerPage);    /**     * 搜索     * @param con     * @return     */public List<E> search(HashMap con);}

?4.业务逻辑实现基类

?

/** * BaseManagerImpl.java * * Copyright 2007 easou, Inc. All Rights Reserved. */package com.easou.ad.bl.impl;import java.util.HashMap;import java.util.List;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import com.easou.ad.bl.BaseManager;import com.easou.ad.dao.BaseDAO;/** * 业务逻辑基类 *  * Revision History *  *  */public class BaseManagerImpl<E,D extends BaseDAO<E>> implements BaseManager <E> {    protected final Log log = LogFactory.getLog(getClass().getName());    /**     * 数据访问接口     */    protected D dao;    /**     * @return List 所有实体     */    public final List<E> getAll() {        return dao.getAllEntity();    }    /**     * @param id 实体主键     * @return 实体     */    public final E get(final Long id) {            return dao.getEntity(id);    }    /**     * @param id 实体主键     */    public final void remove(final Long id) {        dao.removeEntity(id);    }        public List<E> search(HashMap con, int page, int rowsPerPage) {return ((D)dao).search(con, page, rowsPerPage);}public List<E> search(HashMap con) {return ((D)dao).search(con);}    /**     * @param entity 实体     */    public final void save(final E entity) {        dao.saveEntity(entity);    }    /**     *      * @return 获取泛形     */    public final D getDao() {        return dao;    }    /**     *      * @param dao 泛形     */    public final void setDao(final D dao) {        this.dao = dao;    }}

?

?

? 接下来只需要实现基类,就包含了基本crud操作

这样的情况,update T set a=:a where...这样的实现岂不更好?
再者,其实更新的方法应该定义在BaseDAO接口中,如:
update(String hql),update(String hql,Map<String,Object> map)等。
Lz可以对BaseDAO再定义的细致一点。
还有主键的类型尽可能的用Serializable id. 32 楼 xuhbiao 2009-10-08  

不错,学习了。。 33 楼 kaki 2009-10-09   建议吸收大家意见,打包下载吧。

热点排行