Spring中装配DAO

在我的上个博客中对Spring的JDBC模板类进行了源码分析。我们在使用时只需要使用JdbcTemplate类就能完成数据库操作。下面我们看一个例子:

1、DAO实现类

package com.dao.jdbc;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;

import com.dao.UserDao;
import com.domain.User;

public class UserDaoImpl  implements UserDao {

	private JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	public int getMatchCount(String userName, String password) {
		String sqlStr = " SELECT count(*) FROM t_user "
				+ " WHERE user_name =? and password=? ";
		return jdbcTemplate.queryForInt(sqlStr, new Object[] { userName, password });
	}

	public User findUserByUserName(final String userName) {
		String sqlStr = " SELECT user_id,user_name,credits "
				+ " FROM t_user WHERE user_name =? ";
		final User user = new User();
		jdbcTemplate.query(sqlStr, new Object[] { userName },
				new RowCallbackHandler() {
					public void processRow(ResultSet rs) throws SQLException {
						user.setUserId(rs.getInt("user_id"));
						user.setUserName(userName);
						user.setCredits(rs.getInt("credits"));
					}
				});
		return user;
	}

	public void updateLoginInfo(User user) {
		String sqlStr = " UPDATE t_user SET last_visit=?,last_ip=?,credits=? "
				+ " WHERE user_id =?";
		jdbcTemplate.update(sqlStr, new Object[] { user.getLastVisit(),
				user.getLastIp(),user.getCredits(),user.getUserId()});
	}

}

 

从上面我们可以看出,我们在进行数据库操作时只需要JdbcTemplate类就可以完成所有操作。在DAO的实现类中并没有看到数据库连接、关闭等操作。只是根据具体的CRUD操作用面向对象的方式来传递查询参数和返回领域对象DO。

然而,我们的Spring中DAO是怎样来反问数据库的呢?

实际上在讲JdbcTemplate实现机制时我就讲到:JdbcTemplate实现了接口JdbcOperations的所有的数据库操作方法,同时它继承了JdbcAccessor类。JdbcAccessor可以从DataSource中获取相应的属性。所以JdbcTemplate就是从一个DataSource中获取或返回连接。而我们具体的DAO实现类中都有一个JdbcTemplate属性和一个setJdbcTemplate();

所以,我们要想DAO获取数据库连接,就必须事先声明一个数据源。

2、数据源声明

<beans>
	<!-- 配置数据源  -->
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url"
			value="jdbc:mysql://localhost:3306/sampledb" />
		<property name="username" value="root" />
		<property name="password" value="admin" />
	</bean>
...
</beans>

注:这里使用Jakarta的DBCP开源数据库实现方案定义一个数据源。并设置了数据库连接的相关属性。

3、接下来,我们需要配置所使用的JDBC模板类并设置模板类所使用的数据源

 

 

<!-- 配置Jdbc模板  -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	   <property name="dataSource" ><ref bean="dataSource"/> </property>
	</bean> 

注:其中的<ref bean="dataSource"/> 中的dataSource即前面定义的数据源Bean ID。

4、为DAO分配模板类:将模板类传入DAO实现类的setJdbcTemplate()

<!-- 配置dao  -->
	<bean id="loginLogDao" class="com.dao.jdbc.LoginLogDaoImpl">
	   <property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>	
	<bean id="userDao" class="com.dao.jdbc.UserDaoImpl">
	   <property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>

 为每一个DAO都要配置一个关联的JdbcTemplate Bean。

注:其中的ref="jdbcTemplate"中的jdbcTemplate为JDBC模板类配置中的Bean ID。

5、当然,可以将这些配置全部放在一个Spring配置文件中。Spring配置文件的基本结构如下:

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
         <bean>...<bean>
         ...
</beans>

 前面的数据源配置、JDBC模板类配置、DAO配置分别对应于Spring配置文件中的一个bean标记。

 

你可能感兴趣的:(DAO,spring,bean,mysql,jdbc)