[原创]使用Spring的HibernateDaoSupport实现BaseDaoImpl类

公司要做一个新的小项目,之前的项目代码结构不够好,没有用注解,没有BaseDao接口,导致每一个模块都有大量的重复代码.为了解决这个问题,我写了BaseDao接口和它的实现类BaseDaoImpl.其中核心的代码是整合框架以及通用方法的实现.

  1. 定义BaseDao接口.

  2. 定义BaseDaoImpl类,实现BaseDao,继承org.springframework.orm.hibernate3.support.HibernateDaoSupport.在类上方添加注解Repository以供扫描.

  3. Spring的xml配置文件中注入sessionFactory



    classpath:hibernate.cfg.xml

  4. BaseDaoImpl.java中添加一个方法,以注入sessionFactory对象.

    @Resource(name = "sessionFactory")
    public void setSuperHibernateTemplate(SessionFactory sessionFactory) {
    super.setSessionFactory(sessionFactory);
    }

  5. 配置完成.添加一些通用方法进去

    @SuppressWarnings("unchecked")
    public PK save(E newInstance) {
    return (PK) getHibernateTemplate().save(newInstance);
    }

    public E findById(PK id) {
    return (E) getHibernateTemplate().get(getEntityClass(), id);
    }

    @SuppressWarnings("unchecked")
    public List findAll() {
    return getHibernateTemplate().findByCriteria(createDetachedCriteria());
    }

    @SuppressWarnings("unchecked")
    public List findAllByProperty(String propertyName, Object value) {
    DetachedCriteria criteria = createDetachedCriteria();
    criteria.add(Restrictions.eq(propertyName, value));
    return getHibernateTemplate().findByCriteria(criteria);
    }

    public List findByExample(E object) {
    @SuppressWarnings("unchecked")
    List resultList = getHibernateTemplate().findByExample(object, 0, 1);
    return resultList;
    }

    public List findByExample(E object, int firstResult, int maxResults) {
    @SuppressWarnings("unchecked")
    List resultList = getHibernateTemplate().findByExample(object, firstResult, maxResults);
    return resultList;
    }

    public void update(E transientObject) {
    getHibernateTemplate().update(transientObject);
    }

    public void saveOrUpdate(E transientObject) {
    getHibernateTemplate().saveOrUpdate(transientObject);
    }

    public void delete(E persistentObject) {
    getHibernateTemplate().delete(persistentObject);
    }

    protected abstract Class getEntityClass();

    protected DetachedCriteria createDetachedCriteria() {
    return DetachedCriteria.forClass(getEntityClass());
    }

    @SuppressWarnings("unchecked")
    public List findByHQL(String hql, Object... params) {
    return getHibernateTemplate().find(hql, params);
    }

  6. 子类的实现,重写getEntityClass()方法

    public class CollectPubDAOImpl extends BaseDaoImpl<CollectPoint, Integer> implements CollectPubDAO{

    protected Class getEntityClass() {
    return CollectPoint.class;
    }
    }

  7. That's all.Happy coding.

posted @ 2015-06-24 20:52  王龙彪  阅读(490)  评论(0)    收藏  举报