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

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

  1. 定义BaseDao接口.

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

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

     	<bean id="sessionFactory"
     		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     		<property name="configLocation">
     			<value>classpath:hibernate.cfg.xml</value>
     		</property>
     	</bean>
    
  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<E> findAll() {
     		return getHibernateTemplate().findByCriteria(createDetachedCriteria());
     	}
     
     	@SuppressWarnings("unchecked")
     	public List<E> findAllByProperty(String propertyName, Object value) {
     		DetachedCriteria criteria = createDetachedCriteria();
     		criteria.add(Restrictions.eq(propertyName, value));
     		return getHibernateTemplate().findByCriteria(criteria);
     	}
     
     	public List<E> findByExample(E object) {
     		@SuppressWarnings("unchecked")
     		List<E> resultList = getHibernateTemplate().findByExample(object, 0, 1);
     		return resultList;
     	}
     
     	public List<E> findByExample(E object, int firstResult, int maxResults) {
     		@SuppressWarnings("unchecked")
     		List<E> 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<E> getEntityClass();
     
     	protected DetachedCriteria createDetachedCriteria() {
     		return DetachedCriteria.forClass(getEntityClass());
     	}
     
     	@SuppressWarnings("unchecked")
     	public List<E> findByHQL(String hql, Object... params) {
     		return getHibernateTemplate().find(hql, params);
     	}
    
  6. 子类的实现,重写getEntityClass()方法

     public class CollectPubDAOImpl extends BaseDaoImpl<CollectPoint, Integer> implements CollectPubDAO{
    
     	protected Class<CollectPoint> getEntityClass() {
     		return CollectPoint.class;
     	}
     }
    
  7. That's all.Happy coding.

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