这里介绍 Spring 提供的 3 种通过 Xml 实现 DataSource(数据源)注入的方式:使用 Spring
自带的 DriverManagerDataSource、使用 DBCP 连接池和使用 Tomcat 提供的 JNDI。下面分
别来进行介绍。
1 使用 Spring 自带的 DriverManagerDataSource
在第 6 章的例子中,所有示例的配置文档对于 DataSource 的注入,使用的都是 Spring 提供
的 DriverManagerDataSource。使用 DriverManagerDataSource 的在效率上和直接使用 Jdbc 没
有多大的区别,使用 DriverManagerDataSource 的配置文档示例代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!—设定 dataSource -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</property>
<property name="url">
<value>jdbc:microsoft:sqlserver://localhost:1433/stdb</value>
</property>
<property name="name">
<value>admin</value>
</property>
<property name="msg">
<value>admin</value>
</property>
</bean>
<!—设定 transactionManager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="helloDAO" class="com.gc.action.HelloDAO">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>
</beans>
配置文档中 id 为 helloDAO 的 Bean 的示例代码在第 6 章已经讲解过,这里只是把示例代码
展示出来,以示过程的完整性。HelloDAO.java 的示例代码如下:
//******* HelloDAO.java**************
package com.gc.action;
import javax.sql.DataSource;
import org.springframework.jdbc.core.*;
import org.springframework.transaction.*;
import org.springframework.transaction.support.*;
import org.springframework.dao.*;
public class HelloDAO {
private DataSource dataSource;
private PlatformTransactionManager transactionManager;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public int create(String msg) {
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
Object result = transactionTemplate.execute(
new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
// 执行新增的操作,向数据库新增一笔记录
…….
// 返回值是 resultObject
return resultObject;
});
}
}
2 使用 DBCP 连接池
Spring 也提供了对 DBCP 连接池的支持,可以直接在配置文档中配置 DBCP 数据库连接池,
要在 Spring 中使用 DBCP 连接池,需要将 spring-framework-2.0-m1/lib/jakarta-commons 文件
夹中的 commons-collections.jar、commons-dbcp.jar 和 commons-pool.jar 用前面介绍的方法加
入到 ClassPath 中,使用 DBCP 连接池的示例代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!—设定 dataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<!—使用 sqlserver 数据库 -->
<property name="driverClassName">
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</property>
<!—设定 Url -->
<property name="url">
<value>jdbc:microsoft:sqlserver://localhost:1433/stdb</value>
</property>
<!—设定用户名-->
<property name="name">
<value>admin</value>
</property>
<!—设定密码-->
<property name="msg">
<value>admin</value>
</property>
</bean>
<!—设定 transactionManager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="helloDAO" class="com.gc.action.HelloDAO">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>
</beans>
HelloDAO 类的代码和上面的一样,不用改变,这里就不在展示了。
3 使用 Tomcat 提供的 JNDI
与使用 DBCP 连接池外相比,使用 Spring 来进行 Web 开发,更多的是使用 Web 容器提供的
数据库连接池功能,这里以使用 Tomcat 容器为例,来讲解一下在 Spring 中,使用 Tomcat
提供的 JNDI 应该如何配置。首先要在 Tomcat 的 server.xml 中添加一下代码:
<Context path="/myApp" reloadable="true"
docBase="D:/eclipse/workspace/myApp" workDir="D:/eclipse/workspace/myApp/work" >
<Resource name="jdbc/opendb" auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url=" jdbc:microsoft:sqlserver://localhost:1433/stdb"
<!—设定用户名-->
name="admin"
<!—设定密码-->
msg="admin"
<!—设定最大连接数-->
maxActive="10000"
<!—连接最大空闲时间-->
maxIdle="10000"
<!—连接最大等待时间-->
maxWait="10000"
removeAbandoned="true"
removeAbandonedTimeout="10"
logAbandoned="true"
/></Context>
然后 Spring 的配置文档的示例代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!—设定 dataSource -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/opendb</value>
</property>
</bean>
<!—设定 transactionManager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="helloDAO" class="com.gc.action.HelloDAO">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>
</beans>
同样,HelloDAO 的代码不用改变。
上面介绍的这 3 种实现 DataSource 注入的方式,给开发人员的的 Jdbc 编程带来了极大的方
便,主要是因为 Spring 对 Jdbc 进行了良好的封装。