- 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数据库访问代码的开发