Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2313982
  • 博文数量: 252
  • 博客积分: 5472
  • 博客等级: 大校
  • 技术积分: 3107
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-17 18:39
文章分类

全部博文(252)

文章存档

2012年(96)

2011年(156)

分类: Java

2012-01-06 18:54:58

在Spring架构基础上 将其中的JdbcTemplate访问数据库的代码改成用HibernateTemplate访问数据库 最后形成Spring+Hibernate的软件架构
 
准备工作:
1  删除目录\src\com\demo\spring\dao 该目录下面的代码是基于JdbcTemplate开发的DAO层代码 我们将开发基于HibernateTemplate的DAO层来替换它
2  复制jar文件到当前项目的\WEB-INF\lib目录下 使项目来支持Hibernate事务 以及能够提供对Hibernate映射文件的解析
dom4j-1.6.jar
antlr-2.7.5H3.jar
jta.jar
3  基于Hibernate的开发 都需要创建数据库表的映射文件和持久化类 将User.hbm.xml  AbstractUser.java  User.java 复制到当前项目中\src\com\demo\hibernate\beans
 
开发过程:
需要在Bean配置文件中添加一系列组件 这些组件相互注入
  • dataSource 为sessionFactory提供数据源
  • sessionFactory Hibernate管理工厂 为userDAO的事务管理策略对象transactionManager提供sessionFactory
  • transactionManager 为userDAO提供POJO类 利用被注入的数据源 定义一系列的业务操作函数 使用JdbcTemplate来操作POJO类 实现对数据库的操作
  • UserDAOProxy userDAO的事务管理策略对象 该对象规定了userDAO的管理策略 因此他需要注入userDAO作为被管理的对象 进行事务管理也需要提供事务管理器 因此需要注入transactionManager作为事务管理器
  • Action类 该类是响应处理类 负责调度userDAO函数即可实现数据库的访问 而对于userDAO的访问都将在UserDAOProxy的监管之下

图示:

                              dataSource  定义数据源

                                |  注入数据源

               sessionFactory

             注入Hibernate  |             | 注入Hibernate

            POJO         userDAO        transactionManager

                   注入DAO |       |  注入事务 |

                    Action类       UserDAOProxy

步骤:

1 创建数据源dataSource

2 创建sessionFactory 并注入dataSource

3 创建事务管理对象transactionManager 并注入sessionFactory 

4 创建userDAO 并注入sessionFactory

5 创建事务管理策略对象UserDAOProxy 并注入管理策略对象userDAO和所用的事务管理器transactionManager

6 创建Action 并注入userDAO

详细步骤:

1 数据源配置

在applicationContext.xml中添加一个名称为dataSource的 指向的类为DBCP的数据源类

 

  1. <!-- 配置数据源 -->
  2.     <bean id="dataSource"
  3.         class="org.apache.commons.dbcp.BasicDataSource"
  4.         destroy-method="close">
  5.         <property name="driverClassName">
  6.             <value>org.gjt.mm.mysql.Driver</value>
  7.         </property>
  8.         <property name="url">
  9.             <value>jdbc:mysql://localhost:3306/demo</value>
  10.         </property>
  11.         <property name="username">
  12.             <value>root</value>
  13.         </property>
  14.         <property name="password">
  15.             <value></value>
  16.         </property>
  17.     </bean>

 

2 SessionFactory的配置

配置SessionFactory对象 为DAO层提供HIbernate的数据库连接对象 注入配置的dataSource对象

 

  1. <!-- 配置Hibernate -->
  2.     <bean id="sessionFactory"
  3.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  4.         <property name="dataSource">
  5.             <ref local="dataSource" />
  6.         </property>
  7.         <property name="mappingResources">
  8.             <list>
  9.                 <value>com/demo/hibernate/beans/User.hbm.xml</value>
  10.             </list>
  11.         </property>
  12.         <property name="hibernateProperties">
  13.             <props>
  14.                 <prop key="hibernate.dialect">
  15.                     org.hibernate.dialect.MySQLDialect
  16.                 </prop>
  17.                 <prop key="hibernate.show_sql">true</prop>
  18.             </props>
  19.         </property>
  20.     </bean>

 

3  配置事务

为SessionFactory对象增加事务配置组件 并注入上面配置的SessionFactory对象

 

  1. <!-- 配置事务 -->
  2.     <bean id="transactionManager"
  3.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  4.         <property name="sessionFactory">
  5.             <ref local="sessionFactory" />
  6.         </property>
  7.     </bean>

4  配置DAO组件

我们先配置该组件的Bean对象  一个基于HibernateTemplate的DAO类com.demo.hibernate.dao.UserDAO.java 并为这个对象注入SessionFactory对象

 

  1. <!-- 定义DAO -->
  2.     <bean id="userDAO" class="com.demo.hibernate.dao.UserDAO">
  3.         <property name="sessionFactory">
  4.             <ref local="sessionFactory" />
  5.         </property>
  6.     </bean>

5  配置DAO事务

为上面配置的DAO对象配置事务组件 使得对userDAO的访问都在spring的事务监管下 改组件需要注入上面配置的事务对象transactionManager DAO对象userDAO 并配置事务管理的策略

 

  1. <!-- 定义DAO代理 -->
  2.     <bean id="UserDAOProxy"
  3.         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  4.         <property name="transactionManager">
  5.             <ref bean="transactionManager" />
  6.         </property>
  7.         <property name="target">
  8.             <ref local="userDAO" />
  9.         </property>
  10.         <property name="transactionAttributes">
  11.             <props>
  12.                 <prop key="insert*">PROPAGATION_REQUIRED</prop>
  13.                 <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
  14.             </props>
  15.         </property>
  16.     </bean>

 

6  创建Hibernate DAO 类

  首先创建一个接受类 com.demo.hibernate.dao.IUserDAO.java 创建接口的原因是为了让Spring的AOP机制能够进行事务的管理 因为事务的管理是基于AOP实现的

在接口中声明要实现的操作函数

  1. package com.demo.hibernate.dao;

  2. import java.util.List;

  3. import com.demo.hibernate.beans.User;

  4. public interface IUserDAO {

  5.     public boolean isValid(final String username, final String password);

  6.     public boolean i***ist(String username);

  7.     public void insertUser(User user);

  8.     public User getUser(String userid);

  9.     public List getUsers();

  10.     public void deleteUser(String userid);
  11. }

在UserDAO.java 中实现声明的函数

 

  1. package com.demo.hibernate.dao;

  2. import java.util.List;

  3. import org.hibernate.HibernateException;
  4. import org.hibernate.Session;
  5. import org.hibernate.criterion.Restrictions;
  6. import org.springframework.orm.hibernate3.HibernateCallback;
  7. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

  8. import com.demo.hibernate.beans.User;

  9. public class UserDAO extends HibernateDaoSupport implements IUserDAO {

  10.     public boolean isValid(final String username, final String password) {
  11.         List list = (List) getHibernateTemplate().execute(new HibernateCallback() {
  12.             public Object doInHibernate(Session session)
  13.                     throws HibernateException {
  14.                 List result = session.createCriteria(User.class).add(
  15.                         Restrictions.eq("username", username)).add(
  16.                         Restrictions.eq("password", password)).list();
  17.                 return result;
  18.             }
  19.         });
  20.         if (list.size() > 0) {
  21.             return true;
  22.         } else {
  23.             return false;
  24.         }
  25.     }

  26.     public boolean i***ist(final String username) {
  27.         List list = (List) getHibernateTemplate().execute(new HibernateCallback() {
  28.             public Object doInHibernate(Session session)
  29.                     throws HibernateException {
  30.                 List result = session.createCriteria(User.class).add(
  31.                         Restrictions.eq("username", username)).list();
  32.                 return result;
  33.             }
  34.         });
  35.         if (list.size() > 0) {
  36.             return true;
  37.         } else {
  38.             return false;
  39.         }
  40.     }

  41.     public void insertUser(User user) {
  42.         getHibernateTemplate().saveOrUpdate(user);
  43.     }

  44.     public User getUser(String userid) {
  45.         return (User) getHibernateTemplate().get(User.class,
  46.                 new Integer(userid));
  47.     }

  48.     public List getUsers() {
  49.         return getHibernateTemplate().find("from User");
  50.     }

  51.     public void deleteUser(String userid) {
  52.         Object p = getHibernateTemplate().load(User.class, new Integer(userid));
  53.         getHibernateTemplate().delete(p);
  54.     }
  55. }

至此 就完成了使用HibernateTemplate访问数据库的DAO代码的开发了 下面修改Action中的业务函数来调用DAO中的函数

7  修改LoginAction访问UserDAO进行登录验证

首先为LoginAction添加一个变量

 

  1. UserDAO userDAO;    

  2.     public UserDAO getUserDAO() {
  3.         return userDAO;
  4.     }

  5.     public void setUserDAO(UserDAO userDAO) {
  6.         this.userDAO = userDAO;
  7.     }

 

为applicationContext.xml中的loginAction的配置注入userDAO变量

 

  1. <!---定义Action-->
  2.     <bean id="loginAction"
  3.         class="com.demo.spring.actions.LoginAction">
  4.         <property name="commandClass">
  5.             <value>com.demo.spring.forms.LoginForm</value>
  6.         </property>
  7.         <!-- 指定DAO类 -->
  8.         <property name="userDAO">
  9.             <ref local="userDAO" />
  10.         </property>
  11.         <!-- 指定验证类 -->
  12.         <property name="validator">
  13.             <ref local="loginValidator" />
  14.         </property>
  15.         <!-- 指定失败要返回的页面 -->
  16.         <property name="formView">
  17.             <value>login</value>
  18.         </property>
  19.         <!-- 指定成功要返回的页面 -->
  20.         <property name="successView">
  21.             <value>welcome</value>
  22.         </property>
  23.     </bean>

修改LoginAction处理类中用户登录验证函数isValid() 使用被注入对象userDAO的isValid()函数

 

  1. public boolean isValid(LoginForm loginForm) {
  2.         /*if (loginForm.getUsername().equals("admin")
  3.                 || loginForm.getPassword().equals("admin")) {
  4.             return true;
  5.         } else {
  6.             return false;
  7.         }*/
  8.         if(userDAO.isValid(loginForm.getUsername(), loginForm.getPassword())) {
  9.             return true;
  10.         } else {
  11.             return false;
  12.         }
  13.     }

8  RegisterAction访问UserDAO进行用户注册 

方法如7

这样就形成了Spring+Hibernate架构       

阅读(5934) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~