SSH整合 DAO注入sessionfactory的方式汇总

来源:互联网 发布:2018开淘宝店挣钱吗 编辑:程序博客网 时间:2024/06/05 08:16

参考: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"即可:既如下示例:

<beans xmlns="http://www.springframework.org/schema/beans"

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


阅读全文
0 0
原创粉丝点击