- 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
- <bean id="dataSource"
- class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName">
- <value>org.gjt.mm.mysql.Driver</value>
- </property>
- <property name="url">
- <value>jdbc:mysql://localhost:3306/demo</value>
- </property>
- <property name="username">
- <value>admin</value>
- </property>
- <property name="password">
- <value>admin</value>
- </property>
- </bean>
注意:
MySQL的驱动
DBCP数据源还需要另外两个类包:commons-collections-3.1.jar commons-pool-1.2.jar
把上面的三个类包到项目目录WEB-INF\lib目录下
[2]为数据源配置事务
为了增加数据库的事务管理功能 我们配置一个事务管理对象transactionManager 所用的事务类为Spring的默认类 并设置配置的属性dataSource指向刚才配置的数据源 这样就会为改数据源添加数据管理功能 配置的代码如下所示
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource">
- <ref local="dataSource" />
- </property>
- </bean>
2 创建用户表的POJO类User.java
要使用JdbcTemplate进行数据库操作 必须有与数据库表对应的POJO类 供JdbcTemplate使用
- package com.demo.spring.dao;
-
- public class User {
- protected String id;
-
- protected String username;
-
- protected String password;
-
- protected String email;
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
-
- }
3 创建数据操作类com.demo.spring.dao.UserDAO.java
该类使用JdbcTemplate来实现数据库的访问逻辑 要进行数据库的访问 就要为该类定义一个数据源dataSource 因此首先需要为该类添加一个dataSource数据源变量 并添加getter/setter的函数 该数据源的对象将会在下一节中通过Spring的Ioc容器配置进行注入
- package com.demo.spring.dao;
-
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.List;
-
- import javax.sql.DataSource;
-
- import org.springframework.jdbc.core.JdbcTemplate;
- import org.springframework.jdbc.core.RowMapper;
-
- public class UserDAO {
- private DataSource dataSource;
-
- public DataSource getDataSource() {
- return dataSource;
- }
-
- public void setDataSource(DataSource dataSource) {
- this.dataSource = dataSource;
- }
-
- public boolean isValid(String username, String password) {
- List userList = new ArrayList();
- JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
- userList = jdbcTemplate.query("SELECT * FROM user WHERE username='"
- + username + "' and password='" + password + "'",
- new RowMapper() {
- public Object mapRow(ResultSet rs, int rowNum)
- throws SQLException {
- User user = new User();
- user.setId(rs.getString("ID"));
- user.setUsername(rs.getString("username"));
- user.setPassword(rs.getString("password"));
- user.setEmail(rs.getString("email"));
- return user;
- }
- });
- if (userList.size() > 0) {
- return true;
- } else {
- return false;
- }
- }
-
- public boolean i***ist(String username) {
- JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
- int count = jdbcTemplate.queryForInt("SELECT count(*) FROM user WHERE username='" + username
- + "'");
- if (count > 0) {
- return true;
- } else {
- return false;
- }
- }
-
- public void insertUser(User user) {
- String username = user.getUsername();
- String password = user.getPassword();
- String email = user.getEmail();
- JdbcTemplate jt = new JdbcTemplate(getDataSource());
- jt.update("insert into user(username,password,email) values ('"
- + username + "','" + password + "','" + email + "');");
- }
- }
接着我们进行配置DAO的Bean组件
4 配置UserDAO及其事务处理
[1]配置UserDAO
上面创建了数据操作类UserDAO.java 要使用该类 还需要为该类配置对象 并为该类注入数据源对象
- <bean id="userDAO" class="com.demo.spring.dao.UserDAO">
- <property name="dataSource">
- <ref local="dataSource" />
- </property>
- </bean>
[2]配置UserDAO事务代理
为了实现Spring容器对UserDAO的事务管理功能 我们需要配置一个事务代理对象UserDAOProxy
改配置包含三个属性
transactionManager 指向第一步中配置的事务对象
target 指向事务管理的数据对象userDAO
transactionAttribute 指定事务管理的细节 这里添加了一个的列表 每一个元素表示一个权限设置 key通过通配符表示 表示匹配UserDAO.java中的函数名 属性值表示匹配到的函数的操作权限
- <bean id="UserDAOProxy"
- class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <property name="transactionManager">
- <ref bean="transactionManager" />
- </property>
- <property name="target">
- <ref local="userDAO" />
- </property>
- <property name="transactionAttributes">
- <props>
- <prop key="insert*">PROPAGATION_REQUIRED</prop>
- <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
- </props>
- </property>
- </bean>
在配置了UserDAO的事务代理后 Spring会监听对UserDAO的访问 此时所有对UserDAO的访问都将在Spring的事务控制范围之内
5 修改LoginAction访问UserDAO进行登录验证
首先为LoginAction添加一个变量
- UserDAO userDAO;
-
- public UserDAO getUserDAO() {
- return userDAO;
- }
-
- public void setUserDAO(UserDAO userDAO) {
- this.userDAO = userDAO;
- }
然后为applicationContext.xml中的loginAction的配置注入userDAO变量
- <bean id="loginAction"
- class="com.demo.spring.actions.LoginAction">
- <property name="commandClass">
- <value>com.demo.spring.forms.LoginForm</value>
- </property>
- <!-- 指定DAO类 -->
- <property name="userDAO">
- <ref local="userDAO" />
- </property>
- <!-- 指定验证类 -->
- <property name="validator">
- <ref local="loginValidator" />
- </property>
- <!-- 指定失败要返回的页面 -->
- <property name="formView">
- <value>login</value>
- </property>
- <!-- 指定成功要返回的页面 -->
- <property name="successView">
- <value>welcome</value>
- </property>
- </bean>
下面修改LoginAction处理类中的用户登录验证函数isValid() 它使用被注入对象userDAO的isValid()函数 即可查找数据库中改用户名和密码是否存在 如果存在就返回true 否则返回false
- public boolean isValid(LoginForm loginForm) {
- /*if (loginForm.getUsername().equals("admin")
- || loginForm.getPassword().equals("admin")) {
- return true;
- } else {
- return false;
- }*/
- if(userDAO.isValid(loginForm.getUsername(), loginForm.getPassword())) {
- return true;
- } else {
- return false;
- }
- }
- }
6 修改RegisterAction访问UserDAO进行用户注册
跟LoginAction一样 首先需要为RegisterAction添加一个变量
- UserDAO userDAO;
-
- public UserDAO getUserDAO() {
- return userDAO;
- }
-
- public void setUserDAO(UserDAO userDAO) {
- this.userDAO = userDAO;
- }
然后为applicationContext.xml中的registerAction的配置注入userDAO变量
- <bean id="registerAction"
- class="com.demo.spring.actions.RegisterAction">
- <property name="commandClass">
- <value>com.demo.spring.forms.RegisterForm</value>
- </property>
- <!-- 指定DAO类 -->
- <property name="userDAO">
- <ref local="userDAO" />
- </property>
- <!-- 指定验证类 -->
- <property name="validator">
- <ref local="registerValidator" />
- </property>
- <!-- 指定失败要返回的页面 -->
- <property name="formView">
- <value>register</value>
- </property>
- <property name="successView">
- <value>login</value>
- </property>
- </bean>
修改RegisterAction处理类中判断用户名是否存在的函数i***ist() 与LoginAction中i***ist()类似 他使用被注入对象userDAO的i***ist()函数 就可以查找数据库中改用户名是否存在 如果存在就返回true 否则就返回false
- public boolean i***ist(RegisterForm registerForm) {
- /*if (registerForm.getUsername().equals("admin")) {
- return true;
- } else {
- return false;
- }*/
- if (userDAO.i***ist(registerForm.getUsername())) {
- return true;
- } else {
- return false;
- }
- }
然后修改RegisterAction处理类中添加新的用户的函数add() 他使用被注入对象userDAO的insertUser()函数 即可向数据库插入新用户数据
- public void add(RegisterForm registerForm) {
- User user = new User();
- user.setUsername(registerForm.getUsername());
- user.setPassword(registerForm.getPassword1());
- user.setEmail(registerForm.getEmail());
- userDAO.insertUser(user);
- }
至此 就完成了JdbcTemplate数据库访问代码的开发