1. 程式人生 > >SSH整合 DAO注入sessionfactory的方式彙總

SSH整合 DAO注入sessionfactory的方式彙總

參考:http://blog.csdn.net/u011598529/article/details/44070295

===總結的很好。ssh整合  xml方式和註解方式  dao注入sessionFactory都有。

方法一:在spring配置檔案中,為繼承HibernateDaoSupport的DAO注入sessionFactory

Spring為Hibernate的DAO提供工具類:HibernateDaoSupport。該類主要提供如下兩個方法,方便DAO的實現:    public final HibernateTemplate getHibernateTemplate()

 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");

    }

         /**

          * 根據主鍵返回特定例項

          * @ return 特定主鍵對應的Person例項

          * @ param 主鍵值

    public News getPerson(int personid)

         {

           return (Person)getHibernateTemplate().get(Person.class, new Integer(personid));

    }

         /**

          * @ person 需要儲存的Person例項

          */

    public void savePerson(Person person)

         {                

                   getHibernateTemplate().saveOrUpdate(person);

    }

         /**

          * @ param personid 需要刪除Person例項的主鍵

          * /

    public void removePerson(int personid)

         {

                   //先載入特定例項

           Object p = getHibernateTemplate().load(Person.class, new Integer(personid));

                   //刪除特定例項

           getHibernateTemplate().delete(p);

    }

}

可以與前面的PersonDAOHibernate對比,會發現程式碼量大大減少。事實上,DAO的實現依然藉助於HibernateTemplate的模板訪問方式,只是,HibernateDaoSupport將依賴注入SessionFactory的工作已經完成,獲取HibernateTemplate的工作也已完成。該DAO的配置必須依賴於SessionFactory,具體的配置如下:

<?xml version="1.0" encoding="gb2312"?>

<!--  Spring配置檔案的DTD定義-->

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

    "http://www.springframework.org/dtd/spring-beans.dtd">

<!--  Spring配置檔案的根元素是beans-->

<beans>

         <!--定義資料來源,該bean的ID為dataSource-->

         <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

                   <!--  指定資料庫驅動-->

           <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>

                  <!--  指定連線資料庫的URL-->                 

           <property name="url"><value>jdbc:mysql://wonder:3306/j2ee</value></property>

                   <!--  root為資料庫的使用者名稱-->

           <property name="username"><value>root</value></property>

                   <!--  pass為資料庫密碼-->

           <property name="password"><value>pass</value></property>

    </bean>

         <!--定義Hibernate的SessionFactory-->

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

           <!--  依賴注入資料來源,注入正是上文定義的dataSource>

           <property name="dataSource"><ref local="dataSource"/></property>

                   <!--  mappingResouces屬性用來列出全部對映檔案>

           <property name="mappingResources">

                <list>

                     <!--以下用來列出所有的PO對映檔案-->

                                     <value>lee/Person.hbm.xml</value>

                </list>

           </property>

          <!--定義Hibernate的SessionFactory的屬性 -->

           <property name="hibernateProperties">

                    <props>

                                     <!--  指定Hibernate的連線方言-->

                                     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

                                     <!--  不同資料庫連線,啟動時選擇create,update,create-drop-->

                         <prop key="hibernate.hbm2ddl.auto">update</prop>

                    </props>

        </property>

</bean>

<!--  配置Person持久化類的DAO bean-->

<bean id="personDAO" class="lee. PersonDAOHibernate">

           <!--  採用依賴注入來傳入SessionFactory的引用>

           <property name="sessionFactory"><ref local="sessionFactory"/></property>

</bean>

</beans>

程式中可以通過顯式的編碼來獲得personDAO bean,然後執行CRUD操作。也可通過依賴注入,將personDAO的例項注入其他bean屬性,再執行CRUD操作。

方法二:採用自動裝配的方式,免去每個DAO都要在配置檔案中配置sessionFactory的注入

要實現這種方式,只要在配置檔案中加入default-autowire="byname"即可:既如下示例:

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   

  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"    

default-autowire="byName">  

方法三:採用註解方式

sessionFactory的注入依然採用第二種方式,當然也可以採用手動方式。

因為的hibernateDaoSupport中setSessionFactory()方式是final, 不能被重寫 , 

但是可以在繼承hibernateDaoSupport的子類中加入一個方法為SessionFactory注入值

程式碼如下:

@Resource(name = "sessionFactory")
public void setSuperSessionFactory(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}