这个标题被我描述的太乱太杂了,其实要讲的主要是关于怎么得到用来操作数据层所使用的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});
本文介绍两种获取HibernateTemplate的方法:一种是通过继承HibernateDaoSupport并注入SessionFactory;另一种是直接注入HibernateTemplate,避免继承带来的限制。
1075

被折叠的 条评论
为什么被折叠?



