• 数据库访问层中使用GenericDao和HibernateDaoSupport


    1.参考文献

      1).SSH实例:基于HibernateDaoSupport的泛型Dao

      2).GenericDao设计模式

      3).Generic Data Access Objects

    open source project:

      4).genericdao

      5).hibernate-generic-dao

    2.问题

      含有多个pojo实体,每一个pojo都要写一个PojoDAO,非常乏味枯燥,思考有没有一种通过的DAO能够省去为每一个pojo写一个DAO。

    3.GenericDao分析

      GenericDao的目的是通过他来实现通用的数据库访问层,它通过泛型来实现不同pojo也能够使用一个GenericDao来进行访问,只需要设置泛型的类型即可。首先来看一看GenericDao整体结构。

    图1:GenericDao结构图

    ps:2011-12-28

      今天给eclipse安装了GreenUML这个eclipse插件,在eclipse中通过如下网址:http://www.cse.buffalo.edu/faculty/alphonce/green更新插件即可。GreenUML能够根据代码生成UML图,所以我将GenericDao结构生成UML如下:

    下面来解释上面每一个类或者接口的用户

    1. GenericDao<T>:泛型接口,在这里定义了Dao层的基础的CRUD(Create, read, update and delete)方法,比如sava保存实例,delete删除实例等等。
    2. HibernateDaoSupport:这个是由spring提供的一个抽象类:org.springframework.orm.hibernate3.support.HibernateDaoSupport。类里面定义了 HibernateTemplate的实例,是hibernate的ORM结构中最基础的一个类。
    3. HibernateGenericDao:这个类在我们的例子中没有定义任何方法与变量,他的主要的用处是:(1)重写(Override)HibernateDaoSupport 中定义的方法;(2)增加一些对HibernateDaoSupport类的补充。
    4. GenericDaoImplHibernate<T>:这个类继承HibernateGenericDao并实现接口GenericDao<T>
    5. FileDao:数据访问层接口,根据需求定义方法。
    6. FileDaoImpl:实例化的数据库访问层接口FileDao,并继承通用数据库访问层的类。这样如果FileDao中没有定义方法,那么就表明通用数据库访问层GenericDaoImplHibernate已经能够满足需要。

      上面的结构图看上去有点负责,其实是因为这样的接口充分考虑了系统的可扩充性。如果不考虑可扩充性的话,那么像FileDao、FileDaoImpl和HibernateGenericDao都可以去掉,直接让GenericDaoImplHibernate<T>实现GenericDao<T>接口并继承HibernateDaoSupport类就可以了。在后在使用的时候实例化Dao对象,比如:

    GenericDaoImplHibernate<User> userDao=new GenericDaoImplHibernate<User>()

    4.GenericDao代码实例

    根据GenericDao结构图给出各个接口与类的代码。

    4.1.GenericDao.java

    View Code
    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);
        //...
    }

    4.2.HibernateDaoSupport.java

    这个其实只需要导入spring.jar包即可,不过这里我还是贴出它的源代码,以供参考

    View Code
    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());
        }
    }

    4.3.HibernateGenericDao.java

    View Code
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
    
    @SuppressWarnings("unchecked")
    public class HibernateGenericDao extends HibernateDaoSupport {
        //空方法
    }

    4.4.GenericDaoImplHibernate

    View Code
    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);
        }
    }

    4.5.UserDao

    View Code
    import ssh.core.dao.GenericDao;
    import ssh.pojo.User;
    
    public interface UserDao extends GenericDao<User> {
    
    }

    4.6.UserDaoImpl

    View Code
    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 {
        
    }



  • 相关阅读:
    Protobuf
    iOS保持App真后台运行
    oc之考试答题类效果
    oc之脚本
    IOS
    Xcode中控制台中打印中文处理
    iOS-拍照后裁剪,不可拖动照片的问题
    iOS开发之一句代码检测APP版本的更新
    AVAudioSesion和AVAudioPlayer的基本使用
    GCD使用dispatch_semaphore_t创建多线程网络同步请求
  • 原文地址:https://www.cnblogs.com/xwdreamer/p/2300986.html
Copyright © 2020-2023  润新知