引用:http://hi.baidu.com/y0h0001/item/3e9fbc97a1a93f14336eebef
编写获取数据库工具类DBUtil.java
在这个类中,从Spring框架的上下文环境中根据名字rptds,得到一个由Spring框架装配好的DataSource对象,然后使用DataSource对象得到一个与数据库的连接。
package ch16;
// import javax.naming.*;
// import org.apache.commons.logging.Log;
// import org.apache.commons.logging.LogFactory;
import javax.sql.DataSource;
import java.sql.*;
public final class DBUtil {
// private static final Log log=LogFactory.getLog(DBUtil.class);
static DataSource dataSource=null;
//得到一个数据源对象
public static DataSource getDataSource() {
try {
dataSource=(DataSource) ContextHelper.getContext().getBean("rptds");//得到一个DataSource对象
}
catch(Exception e) {
// log.info("获取数据源出现错误,检查Spring数据源配置!");
}
return dataSource;
}
public static Connection makeConnection() {
Connection conn=null;
try {
if (dataSource==null)
dataSource=getDataSource();
if (dataSource!=null)
conn=dataSource.getConnection();
}
catch(SQLException e) {
// log.info("通过数据源获得连接发生错误!");
}
return conn;
}
public static void closeConnection(Connection con) {
try {
if (con!=null)
con.close();
}
catch(SQLException e) {
// log.info("关闭数据库连接发生错误!");
}
}
}
在程序中,通过dataSource=(DataSource)ContextHelper.getContext().getBean("rptds");语句根据名字rptds自动获得一个DriverManagerDataSource类型的DataSource对象,利用该对象获得与数据库的连接。
对DBUtil.java进行测试的JSP页面:
<%@ page import="ch16.*"%>
数据库连接:<%= DBUtil.makeConnection() %>
16.4.6 编写测试页面TestSpring.jsp
<%@ page import="ch16.*"%>
<%@ page import="java.sql.*"%>
<%
Connection con=null;
try {
con=DBUtil.makeConnection();
String testSql="select * from t_user";
Statement stmt=null;
stmt=con.createStatement();
ResultSet rs=stmt.executeQuery(testSql);
out.print("<table border='1'>");
while(rs.next()) {
String firstname=rs.getString("firstname");
String lastname=rs.getString("lastname");
out.println("<tr><td>"+firstname+"</td><td>"+lastname+"</td></tr>");
}
out.println("</table>");
}
catch(Exception e) {
out.print(e);
}
finally{
DBUtil.closeConnection(con);
}
%>
这个JSP页面使用DBUtil类获得和关闭与数据库的连接,然后查询数据库中的信息。各个部分的关系如下:
JSP页面 <-----连接--- DBUtil <---DataSource--- ContextHelper <---配置--- DBContext.xml
+
+-------------根据连接查询------>数据库中的t-user表
+
+<------------ 查询结果-----------------+
16.4.7 数据库连接池配置
Spring框架提供的的DriverManagerDataSource类本身并没有提供数据库连接池的功能,因此只能用来做简单的测试,并不适合在真正的Web项目中使用。可以考虑用比较成熟的数据库连接池来替换它,比如Apache 的 DBCP连接池,如果要替换,则需要加载Apache的DBCP。
Apache提供的BasicDataSource类也实现了DataSource接口,并且提供了数据库连接池功能,该类可以根据在Spring的组装配置文件定义的<bean>得到一个DataSource对象。
<bean id="rptds" destroy-method="close" class=
"org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/st</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>zym</value>
</property>
</bean>
现在所使用的是org.apache.commons.dbcp.BasicDataSource作为注入的DataSource实例,为了使用DBCP,需要commons-dbcp.jar、commons-pool.jar、commons-collections.jar。注意:在dataSource上设置了destroy-method属性,如此可以确保BeanFactory在关闭时也一并关闭BasicDataSource实例。
16.4.8 使用JNDI数据源
Spring框架提供的JndiObjectFactoryBean也类实现了DataSource接口,如果Servlet容器中定义了JNDI的DataSource,该类可以根据JNDI数据源配置来得到一个DataSource对象。
<bean id="rptds" class="org.springframework.jndi.JndiObjectFactoryBean" >
<property name="jndiName">
<value>java:comp/env/jdbc/spring</value>
</property>
</bean>
为了使用org.springframework.jndi.JndiObjectFactoryBean类,需要添加spring-context.jar,jndiName实际上要根据所设定的JNDI名称查询。
16.4.9 在JSP页面中得到Spring装配的对象
try {
ApplicationContext context=WebApplicationContextUtils.
getWebApplicationContext(application);
Student stu=(Student)context.getBean("student");
}
catch(Exception e) {
}
16.5 Spring与Struts2的整合
在Spring中装配好Struts2所需要使用的Action组件,在Struts2中直接使用由Spring装配好的Action组件,这个整合基本上不需要进行配置,只需要在Struts2的<action>元素的class属性中直接使用Spring中配置好的Bean的名字。
例题:Spring与Struts2的整合
16.6 Spring与Hibernate3的整合
Spring与Hibernate3的整合需要使用Spring提供的HibernateTemplate类来完成,在Spring框架的装配文件中,首先配置数据源Bean,然后配置数据源工厂Bean,并且注入数据源Bean,然后配置Spring提供的HibernateTemplate类,并且注入数据源工厂Bean,再配置用户编写的DAO,并且将HibernateTemplate实例注入到DAO中,这样,在页面中就可以获得DAO实例,并且调用DAO实例的方法通过Hibernate完成对数据库的操作。