使用Spring的JdbcTemplate访问数据库
JdbcTemplate 模板可以简化JDBC操作,但是创建一个JdbcTemplate需要一个DataSource接口,在Spring中,当然就是向 JdbcTemplate中注入一个DataSource,然后通过JdbcTemplate来获取一个连接(Connection)。
假设SQL Server 2000数据库(新建的数据库名称为hibernate)中有一张person表,简单地记录了人员的详细信息。
使用Spring的IOC机制实现注入,配置XML代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="springDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.microsoft.jdbc.sqlserver.SQLServerDriver">
</property>
<property name="url"
value="jdbc:microsoft:sqlserver://localhost:1433;databasename=hibernate">
</property>
<property name="username" value="sa"></property>
<property name="password" value="111111"></property>
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate" abstract="false"
lazy-init="false" autowire="default" dependency-check="default">
<property name="dataSource">
<ref bean="springDataSource" />
</property>
</bean>
</beans>
首先编写一个PersonDao,代码如下所示:
package org.shirdrn.jdbcTemplate.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import org.shirdrn.interf.IPersonDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class PersonDao implements IPersonDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { // 注入JdbcTemplate
this.jdbcTemplate = jdbcTemplate;
}
public Connection getConnection(){ // 获取Connection
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource springDataSource = (DataSource)ctx.getBean("springDataSource");
JdbcTemplate jdbcTemplate = (JdbcTemplate)ctx.getBean("jdbcTemplate");
/*jdbcTemplate.setDataSource(springDataSource);
setJdbcTemplate(jdbcTemplate); */
DataSource dataSource = jdbcTemplate.getDataSource();
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public ResultSet queryPersons(String sql){
ResultSet rs = null;
try {
Connection connection = getConnection();
Statement st = connection.createStatement();
rs = st.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
}
上面注释掉的两行代码:
jdbcTemplate.setDataSource(springDataSource);
setJdbcTemplate(jdbcTemplate);
其实是多余的,实际上Spring的IOC容器会自动检测并自动注入的。
建立测试主函数:
package org.shirdrn.main;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.shirdrn.jdbcTemplate.dao;
public class Main {
public static void main(String[] args){
PersonDao pd = new PersonDao();
ResultSet rs = pd.queryPersons("select * from person");
int n = 0;
try {
while(rs.next()){
n++;
System.out.println("id = "+rs.getString("id"));
System.out.println("name = "+rs.getString("name"));
System.out.println("gender = "+rs.getString("gender"));
System.out.println("age = "+rs.getString("age"));
System.out.println("addr = "+rs.getString("addr"));
System.out.println("*******************************");
}
System.out.println("数据库中共有记录 "+n+" 条");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
保证数据库表中有测试数据,(我的)运行程序结果输出如下所示:
id = 222403199901011111
name = 刘备
gender = 男
age = 21
addr = 北京
*******************************
id = 222403199901011112
name = 张飞
gender = 男
age = 23
addr = 天津
*******************************
id = 222403199901011113
name = 吕布
gender = 男
age = 22
addr = 上海
*******************************
id = 222403199901011114
name = 貂蝉
gender = 女
age = 22
addr = 大连
*******************************
id = 222403199901011115
name = 董卓
gender = 男
age = 20
addr = 长春
*******************************
id = 222403199901011116
name = 关羽
gender = 男
age = 18
addr = 北京
*******************************
id = 222403199901011117
name = 李逵
gender = 女
age = 19
addr = 成都
*******************************
id = 222403199901011118
name = 宋江
gender = 女
age = 21
addr = 青岛
*******************************
id = 222403199901011119
name = 林冲
gender = 男
age = 23
addr = 杭州
*******************************
id = 222403199901011120
name = 高俅
gender = 男
age = 21
addr = 敦化
*******************************
id = 222403199901011121
name = 晁盖
gender = 男
age = 20
addr = 广州
*******************************
id = 222403199901011122
name = 王五
gender = 女
age = 18
addr = 深圳
*******************************
id = 222403199901011123
name = 张三
gender = 男
age = 17
addr = 兰州
*******************************
id = 222403199901011124
name = 李四
gender = 女
age = 25
addr = 北京
*******************************
id = 222403199901011125
name = 赵启
gender = 男
age = 28
addr = 香港
*******************************
数据库中共有记录 15 条
注 入的DataSource是org.springframework.jdbc.datasource.DriverManagerDataSource 的实例,然后在一个JdbcTemplate中注入已经获取到的DataSource,接着就可以建立与数据库的连接了。