代码改变世界

Hibernate的DAO实现

2011-10-26 17:27  Batys  阅读(3634)  评论(0编辑  收藏  举报

DAO(Data Access Object)对象是模块化的数据库访问组件,DAO对象通常包括:对持久化类的基本CRUD操作(插入、查询、更新、删除)操作。Spring对Hibernate的DAO实现提供了良好的支持。主要有如下两种方式的DAO实现:

    继承HibernateDaoSupport的实现DAO

    基于Hibernate3.0实现DAO

不管采用哪一种实现,这种DAO对象都极好地融合到Spring的ApplicationContext中,遵循依赖注入模式,提高解耦。

 

1 继承HibernateDaoSupport实现DAO

Spring为Hibernate的DAO提供工具类:HibernateDaoSupport。该类主要提供如下两个方法,方便DAO的实现:

(1) public final HibernateTemplate getHibernateTemplate()

(2) public final void setSessionFactory(SessionFactory sessionFactory)

其中,setSessionFactory方法用来接收Spring的 ApplicationContext的依赖注入,可接收配置在Spring的SessionFactory实 例,getHibernateTemplate方法则用来根据刚才的SessionFactory产生Session,最后生成 HibernateTemplate来完成数据库访问。

典型的继承HibernateDaoSupport的DAO实现的代码如下:

public class PersonDAOHibernate extends HibernateDaoSupport implements PersonDAO

{

    //采用log4j来完成调试时的日志功能

private static Log log = LogFactory.getLog(NewsDAOHibernate.class);

         //返回全部的人的实例

    public List getPersons()

              

                   //通过HibernateTemplate的find方法返回Person的全部实例

           return getHibernateTemplate().find("from Person");

    }

        

    public void savePerson(Person person)

                       

                   getHibernateTemplate().saveOrUpdate(person);

    }

        

         public void setSessionFactory(SessionFactory sessionFactory)

         {

                   this.sessionFactory = sessionFactory;

    }

        

       

    public Collection findPersonsByName(String name)

         {

           return this.sessionFactory.getCurrentSession().createQuery("from lee.Person p where p.name=?").setParameter(0, name).list();

    }

        

    public Person findPersonsById(int id)

         {

           return (Person)this.sessionFactory.getCurrentSession().load(Person.class,new Integer(id))

    }

}

该DAO的数据库访问方式,类似于传统的Hibernate的访问,区别在于获取Session的方式不同。传统的Hibernate的 SessionFactory,采用工具类HibernateUtils来保存成静态成员变量,每次采用HibernateUtils打开 Session。

传统的Session访问方式,很容易造成“每次数据库操作打开一次Session”的方式,该方式效率低下,也是Hibernate不推荐采用的策略。 Hibernate推荐采用“每次事务打开一次Session”。基于该原因,Hibernate3.0.1提供"contextual Sessions”的技术,最终达到与继承HibernateDaoSupport的DAO实现相同的目的。

同样,此DAO bean也需要配置在Spring的上下文中,需要依赖于SessionFactory bean。SessionFactory bean由Spring在运行时动态为DAO bean注入。具体的配置文件,读者可参考上文的配置文件写出。