数据库访问层中使用GenericDao和HibernateDaoSupport
1).SSH实例:基于HibernateDaoSupport的泛型Dao
2).GenericDao设计模式
3).Generic Data Access Objects
open source project:
4).genericdao
5).hibernate-generic-dao
含有多个pojo实体,每一个pojo都要写一个PojoDAO,非常乏味枯燥,思考有没有一种通过的DAO能够省去为每一个pojo写一个DAO。
GenericDao的目的是通过他来实现通用的数据库访问层,它通过泛型来实现不同pojo也能够使用一个GenericDao来进行访问,只需要设置泛型的类型即可。首先来看一看GenericDao整体结构。
图1:GenericDao结构图
今天给eclipse安装了GreenUML这个eclipse插件,在eclipse中通过如下网址:http://www.cse.buffalo.edu/faculty/alphonce/green更新插件即可。GreenUML能够根据代码生成UML图,所以我将GenericDao结构生成UML如下:
下面来解释上面每一个类或者接口的用户
上面的结构图看上去有点负责,其实是因为这样的接口充分考虑了系统的可扩充性。如果不考虑可扩充性的话,那么像FileDao、FileDaoImpl和HibernateGenericDao都可以去掉,直接让GenericDaoImplHibernate<T>实现GenericDao<T>接口并继承HibernateDaoSupport类就可以了。在后在使用的时候实例化Dao对象,比如:
GenericDaoImplHibernate<User> userDao=new GenericDaoImplHibernate<User>()
根据GenericDao结构图给出各个接口与类的代码。
import java.io.Serializable;import java.util.List;public interface GenericDao<T> { public void save(Object o);//保存 void delete(Object o);//删除修改 void deleteById(Serializable id); public void update(Object o);// public void saveOrUpdate(Object o); public T getById(Serializable id);//查询 public List<T> findAll(Class<T> entityClass); public List<T> findByExample(Object o); //...}
这个其实只需要导入spring.jar包即可,不过这里我还是贴出它的源代码,以供参考
import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.springframework.dao.DataAccessException;import org.springframework.dao.DataAccessResourceFailureException;import org.springframework.dao.support.DaoSupport;import org.springframework.orm.hibernate3.HibernateTemplate;import org.springframework.orm.hibernate3.SessionFactoryUtils;public abstract class HibernateDaoSupport extends DaoSupport { private HibernateTemplate hibernateTemplate; public final void setSessionFactory(SessionFactory sessionFactory) { this.hibernateTemplate = createHibernateTemplate(sessionFactory); } protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) { return new HibernateTemplate(sessionFactory); } public final SessionFactory getSessionFactory() { return (this.hibernateTemplate != null ? this.hibernateTemplate.getSessionFactory() : null); } public final void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } public final HibernateTemplate getHibernateTemplate() { return this.hibernateTemplate; } protected final void checkDaoConfig() { if (this.hibernateTemplate == null) { throw new IllegalArgumentException("'sessionFactory' or 'hibernateTemplate' is required"); } } protected final Session getSession() throws DataAccessResourceFailureException, IllegalStateException { return getSession(this.hibernateTemplate.isAllowCreate()); } protected final Session getSession(boolean allowCreate) throws DataAccessResourceFailureException, IllegalStateException { return (!allowCreate ? SessionFactoryUtils.getSession(getSessionFactory(), false) : SessionFactoryUtils.getSession( getSessionFactory(), this.hibernateTemplate.getEntityInterceptor(), this.hibernateTemplate.getJdbcExceptionTranslator())); } protected final DataAccessException convertHibernateAccessException(HibernateException ex) { return this.hibernateTemplate.convertHibernateAccessException(ex); } protected final void releaseSession(Session session) { SessionFactoryUtils.releaseSession(session, getSessionFactory()); }}
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;@SuppressWarnings("unchecked")public class HibernateGenericDao extends HibernateDaoSupport { //空方法}
import java.io.Serializable;import java.lang.reflect.ParameterizedType;import java.util.List;import org.hibernate.criterion.DetachedCriteria;import org.hibernate.criterion.Order;import org.springframework.util.Assert;import ssh.core.dao.GenericDao;import ssh.core.dao.support.HibernateGenericDao;@SuppressWarnings("unchecked")public class GenericDaoImplHibernate<T> extends HibernateGenericDao implements GenericDao<T>{ protected Class<T> entityClass; public GenericDaoImplHibernate() { entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } protected Class<T> getEntityClass() { return entityClass; } @Override public List<T> findAll(Class<T> entityClass) { return getHibernateTemplate().loadAll(entityClass); } public List<T> findAll(Class<T> entityClass, String orderBy, boolean isAsc) { Assert.hasText(orderBy); if (isAsc) return getHibernateTemplate().findByCriteria( DetachedCriteria.forClass(entityClass).addOrder(Order.asc(orderBy))); else return getHibernateTemplate().findByCriteria( DetachedCriteria.forClass(entityClass).addOrder(Order.desc(orderBy))); } @Override public List<T> findByExample(Object o) { return getHibernateTemplate().findByExample(o); } @Override public T getById(Serializable id) { return (T)getHibernateTemplate().get(entityClass, id); } @Override public void deleteById(Serializable id) { delete(getById(id)); } @Override public void delete(Object o) { getHibernateTemplate().delete(o); } @Override public void save(Object o) { getHibernateTemplate().save(o); } @Override public void saveOrUpdate(Object o) { getHibernateTemplate().saveOrUpdate(o); } @Override public void update(Object o) { getHibernateTemplate().update(o); }}
import ssh.core.dao.GenericDao;import ssh.pojo.User;public interface UserDao extends GenericDao<User> {}
import com.sjtu.erp.ssh.base.dao.UserDao;import com.sjtu.erp.ssh.core.dao.impl.GenericDaoImplHibernate;import com.sjtu.erp.ssh.pojo.User;public class UserDaoImpl extends GenericDaoImplHibernate<User> implements UserDao { }