轉自:https://blog.csdn.net/yz9612/article/details/80234377java
spring爲hibernate的DAO提供工具類:HibernateDaoSupport。該類主要提供以下兩個方法,方便DAO的實現: public final HibernateTemplate getHibernateTemplate()mysql
public final void setSessionFactory(SessionFactory sessionFactory)spring
其中,setSessionFactory方法用來接收Spring的ApplicationContext的依賴注入,可接收配置在Spring的SessionFactory實例,getHibernateTemplate方法則用來根據剛纔的SessionFactory產生Session,最後生成HibernateTemplate來完成數據庫訪問。sql
典型的繼承HibernateDaoSupport的DAO實現的代碼以下:數據庫
public class PersonDAOHibernate extends HibernateDaoSupport implements PersonDAOsession
{app
//採用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操做。
在繼承HibrnateDaoSupport的DAO實現裏,Hibernate Session的管理徹底不須要Hibernate代碼打開,而由Spring來管理。Spring會根據實際的操做,採用「每次事務打開一次session」的策略,自動提升數據庫訪問的性能。