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

全部博文(252)

文章存档

2012年(96)

2011年(156)

分类: Java

2012-01-06 15:37:51

配置如下Bean组件
  • dataSource 为userDAO和transactionManager提供数据源
  • transactionManager 为userDAO的事务管理策略对象UserDAOProxy提供事务管理器对象
  • userDAO 为userDAO提供POJO类 利用被注入的数据源 定义一系列的业务操作函数 使用JdbcTemplate来操作POJO类 实现对数据库的操作
  • UserDAOProxy userDAO的事务管理策略对象 该对象规定了userDAO的管理策略 因此需要注入userDAO作为管理的对象 进行事务管理也需要提供事务管理器 因此也需要注入transactionManager作为事务管理器
  • Action类 该类是响应处理类 负责调度userDAO函数即可实现数据库的访问 而对于userDAO的访问都将在UserDAOProxy的监督之下

增加数据库代码的Bean注入过程

 

                         dataSource  定义数据源

       注入数据源      |                      |      注入数据源

                       |                      |

POJO:                userDAO             transactionManager

        注入DAO    |           |注入事务  |

                  |           |         |

                Action类        UserDAOProxy

该过程按照执行的顺序 包含以下几个步骤

1 创建数据源dataSource

2 创建事务管理对象transactionManager 并注入数据源dataSource

3 创建userDAO 并注入数据源dataSource

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

5 创建Action类 并注入userDAO

 

详细步骤

1 配置数据源和事务

[1] 配置数据源

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

并指定4个数据参数 driverClassName url username password

 

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

注意:

MySQL的驱动 

DBCP数据源还需要另外两个类包:commons-collections-3.1.jar    commons-pool-1.2.jar

把上面的三个类包到项目目录WEB-INF\lib目录下

[2]为数据源配置事务

为了增加数据库的事务管理功能 我们配置一个事务管理对象transactionManager 所用的事务类为Spring的默认类 并设置配置的属性dataSource指向刚才配置的数据源 这样就会为改数据源添加数据管理功能 配置的代码如下所示

 

  1. <bean id="transactionManager"
  2.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3.         <property name="dataSource">
  4.             <ref local="dataSource" />
  5.         </property>
  6.     </bean>

2  创建用户表的POJO类User.java

要使用JdbcTemplate进行数据库操作 必须有与数据库表对应的POJO类 供JdbcTemplate使用

 

  1. package com.demo.spring.dao;

  2. public class User {
  3.     protected String id;
  4.     
  5.     protected String username;
  6.     
  7.     protected String password;
  8.     
  9.     protected String email;

  10.     public String getEmail() {
  11.         return email;
  12.     }

  13.     public void setEmail(String email) {
  14.         this.email = email;
  15.     }

  16.     public String getId() {
  17.         return id;
  18.     }

  19.     public void setId(String id) {
  20.         this.id = id;
  21.     }

  22.     public String getPassword() {
  23.         return password;
  24.     }

  25.     public void setPassword(String password) {
  26.         this.password = password;
  27.     }

  28.     public String getUsername() {
  29.         return username;
  30.     }

  31.     public void setUsername(String username) {
  32.         this.username = username;
  33.     }
  34.     
  35.     
  36. }

 

3  创建数据操作类com.demo.spring.dao.UserDAO.java

该类使用JdbcTemplate来实现数据库的访问逻辑 要进行数据库的访问 就要为该类定义一个数据源dataSource 因此首先需要为该类添加一个dataSource数据源变量 并添加getter/setter的函数 该数据源的对象将会在下一节中通过Spring的Ioc容器配置进行注入

 

  1. package com.demo.spring.dao;

  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import java.util.ArrayList;
  5. import java.util.List;

  6. import javax.sql.DataSource;

  7. import org.springframework.jdbc.core.JdbcTemplate;
  8. import org.springframework.jdbc.core.RowMapper;

  9. public class UserDAO {
  10.     private DataSource dataSource;

  11.     public DataSource getDataSource() {
  12.         return dataSource;
  13.     }

  14.     public void setDataSource(DataSource dataSource) {
  15.         this.dataSource = dataSource;
  16.     }

  17.     public boolean isValid(String username, String password) {
  18.         List userList = new ArrayList();
  19.         JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
  20.         userList = jdbcTemplate.query("SELECT * FROM user WHERE username='"
  21.                 + username + "' and password='" + password + "'",
  22.                 new RowMapper() {
  23.                     public Object mapRow(ResultSet rs, int rowNum)
  24.                             throws SQLException {
  25.                         User user = new User();
  26.                         user.setId(rs.getString("ID"));
  27.                         user.setUsername(rs.getString("username"));
  28.                         user.setPassword(rs.getString("password"));
  29.                         user.setEmail(rs.getString("email"));
  30.                         return user;
  31.                     }
  32.                 });
  33.         if (userList.size() > 0) {
  34.             return true;
  35.         } else {
  36.             return false;
  37.         }
  38.     }

  39.     public boolean i***ist(String username) {
  40.         JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
  41.         int count = jdbcTemplate.queryForInt("SELECT count(*) FROM user WHERE username='" + username
  42.                 + "'");        
  43.         if (count > 0) {
  44.             return true;
  45.         } else {
  46.             return false;
  47.         }
  48.     }

  49.     public void insertUser(User user) {
  50.         String username = user.getUsername();
  51.         String password = user.getPassword();
  52.         String email = user.getEmail();
  53.         JdbcTemplate jt = new JdbcTemplate(getDataSource());
  54.         jt.update("insert into user(username,password,email) values ('"
  55.                 + username + "','" + password + "','" + email + "');");
  56.     }
  57. }

接着我们进行配置DAO的Bean组件

4  配置UserDAO及其事务处理

[1]配置UserDAO

上面创建了数据操作类UserDAO.java 要使用该类 还需要为该类配置对象 并为该类注入数据源对象

 

  1. <bean id="userDAO" class="com.demo.spring.dao.UserDAO">
  2.         <property name="dataSource">
  3.             <ref local="dataSource" />
  4.         </property>
  5.     </bean>

[2]配置UserDAO事务代理

为了实现Spring容器对UserDAO的事务管理功能 我们需要配置一个事务代理对象UserDAOProxy

改配置包含三个属性 

transactionManager 指向第一步中配置的事务对象

target 指向事务管理的数据对象userDAO

transactionAttribute 指定事务管理的细节 这里添加了一个的列表 每一个元素表示一个权限设置 key通过通配符表示 表示匹配UserDAO.java中的函数名 属性值表示匹配到的函数的操作权限

 

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

在配置了UserDAO的事务代理后 Spring会监听对UserDAO的访问 此时所有对UserDAO的访问都将在Spring的事务控制范围之内

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

下面修改LoginAction处理类中的用户登录验证函数isValid()  它使用被注入对象userDAO的isValid()函数 即可查找数据库中改用户名和密码是否存在 如果存在就返回true 否则返回false

 

  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.     }
  14. }

6  修改RegisterAction访问UserDAO进行用户注册

跟LoginAction一样 首先需要为RegisterAction添加一个变量

 

  1. UserDAO userDAO;

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

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

然后为applicationContext.xml中的registerAction的配置注入userDAO变量

 

  1. <bean id="registerAction"
  2.         class="com.demo.spring.actions.RegisterAction">
  3.         <property name="commandClass">
  4.             <value>com.demo.spring.forms.RegisterForm</value>
  5.         </property>
  6.         <!-- 指定DAO类 -->
  7.         <property name="userDAO">
  8.             <ref local="userDAO" />
  9.         </property>
  10.         <!-- 指定验证类 -->
  11.         <property name="validator">
  12.             <ref local="registerValidator" />
  13.         </property>
  14.         <!-- 指定失败要返回的页面 -->
  15.         <property name="formView">
  16.             <value>register</value>
  17.         </property>
  18.         <property name="successView">
  19.             <value>login</value>
  20.         </property>
  21.     </bean>

修改RegisterAction处理类中判断用户名是否存在的函数i***ist() 与LoginAction中i***ist()类似 他使用被注入对象userDAO的i***ist()函数 就可以查找数据库中改用户名是否存在 如果存在就返回true 否则就返回false

 

  1. public boolean i***ist(RegisterForm registerForm) {
  2.         /*if (registerForm.getUsername().equals("admin")) {
  3.          return true;
  4.          } else {
  5.          return false;
  6.          }*/
  7.         if (userDAO.i***ist(registerForm.getUsername())) {
  8.             return true;
  9.         } else {
  10.             return false;
  11.         }
  12.     }

然后修改RegisterAction处理类中添加新的用户的函数add() 他使用被注入对象userDAO的insertUser()函数 即可向数据库插入新用户数据

 

  1. public void add(RegisterForm registerForm) {
  2.         User user = new User();
  3.         user.setUsername(registerForm.getUsername());
  4.         user.setPassword(registerForm.getPassword1());
  5.         user.setEmail(registerForm.getEmail());
  6.         userDAO.insertUser(user);
  7.     }

 

至此 就完成了JdbcTemplate数据库访问代码的开发 

 

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