公司要做一个新的小项目,之前的项目代码结构不够好,没有用注解,没有BaseDao接口,导致每一个模块都有大量的重复代码.为了解决这个问题,我写了BaseDao
接口和它的实现类BaseDaoImpl
.其中核心的代码是整合框架以及通用方法的实现.
定义
BaseDao
接口.- 定义
BaseDaoImpl
类,实现BaseDao
,继承org.springframework.orm.hibernate3.support.HibernateDaoSupport
.在类上方添加注解Repository
以供扫描. 在
Spring
的xml配置文件中注入sessionFactory
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> </bean>
在
BaseDaoImpl.java
中添加一个方法,以注入sessionFactory
对象.@Resource(name = "sessionFactory") public void setSuperHibernateTemplate(SessionFactory sessionFactory) { super.setSessionFactory(sessionFactory); }
配置完成.添加一些通用方法进去
@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); }
子类的实现,重写getEntityClass()方法
public class CollectPubDAOImpl extends BaseDaoImpl<CollectPoint, Integer> implements CollectPubDAO{ protected Class<CollectPoint> getEntityClass() { return CollectPoint.class; } }
That's all.Happy coding.