这个标题被我描述的太乱太杂了,其实要讲的主要是关于怎么得到用来操作数据层所使用的hibernateTemplate(另一个种方法是通过jdbcTemplate,但推荐使用第一种)。而hibernateTemplate是通过sessionFactory得到的,sessionFactory存在于hibernateDAOSupport来得到。(一切都是spring给我们封装好的)
这里的关键是怎么通过spring对DAO的操作得到我们要的hibernateTemplate
我们先看spring中的一段源码。
-
public final void setSessionFactory(SessionFactory sessionFactory) {
-
if ( this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
-
this.hibernateTemplate = createHibernateTemplate(sessionFactory);
-
}
-
}
public final HiberanteTemplate getHibernateTemplate()。。。。
①采用通过spring注入sessionFactory,前提是让DAO层继承hibernateDAOSupport,这样DAO类也就有了sessionFactory,然后通过在xml中编写进行注入。
这样使用起来的确是很方便(详情见后面代码)但是有不好的地方。其一你这个DAO层继承了hibernateDAOSupport之后,由于Java只能继承一个父类,便失去了继承其他的可能性。其二,这回增加耦合度,让代码至少不那么“干净透明”
②采用通过我不继承hibernateDAOSupport,而是直接给我的DAO层注入一个hibernateTemplate(因为我们的最终目标就是这个hibernateTemplate,我们注入sessionFactory是一个不得不为的行为,spring给我们的就是通过只要给spring一个sessionFactory,spring就还你一个hibernateTemplate)
这样的话每一个DAO层中都有一个对hibernateTemplate的set方法(为了注入),这样的确不用再去继承hibernateDAOSupport,可DAO层的代码中会多和关键操作无关的代码,如上面的set
还是看代码直接清晰,如下
采用第一种方法:
-
<!-- 以下为用户管理的依赖注入 -->
-
<bean id= "UserDao" class= "org.nbu.lab1220.daoImpl.UserDaoImpl">
-
<property name= "sessionFactory">
-
<ref local= "sessionFactory" />
-
</property>
-
</bean>
-
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
-
-
-
public ArrayList<User> loginVaild(String userAccount, String password) {
-
-
return (ArrayList<User>) getHibernateTemplate().find( "from User p where p.userAccount=? and p.password=?", new Object[]{userAccount,password});
-
}}
采用第二种方法:
-
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
-
<property name="sessionFactory" ref="sessionFactory"> </property>
-
</bean>
-
<bean id="UserDao" class="org.nbu.lab1220.daoImpl.UserDaoImpl">
-
<property name="hibernateTemplate" ref="hibernateTemplate"> </property>
-
</bean>
-
public class UserDaoImpl implements UserDao{
-
-
private HibernateTemplate hibernateTemplate;
-
public HibernateTemplate getHibernateTemplate() {
-
return hibernateTemplate;
-
}
-
-
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
-
this.hibernateTemplate = hibernateTemplate;
-
}
-
-
-
"unchecked")(
-
public ArrayList<User> loginVaild(String userAccount, String password) {
-
-
return (ArrayList<User>) this.hibernateTemplate.find( "from User p where p.userAccount=? and p.password=?", new Object[]{userAccount,password});