下面通过实例来了解 JdbcTemplate是如何使用的。
实现思路是:首先编写配置文档,然后通过在程序中使用 JdbcTemplate,
并和事务处理结合在一起,具体编写步骤如下:
(1)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.jdbc.datasource.DriverManagerDataSource">
<!—使用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>
<!—示例中的一个DAO -->
<bean id="helloDAO" class="com.gc.action.HelloDAO">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>
</beans>
(2)在类 HelloDAO 中使用 JdbcTemplate,并和事务处理结合在一起,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;
}
//使用JdbcTemplate
public int create(String msg) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("INSERT INTO hello VALUES(1, 'gf', 'HelloWord')");
} catch (DataAccessException ex) {
// 也可以執行status.setRollbackOnly();
transactionManager.rollback(status);
throw ex;
} final y {
transactionManager.commit(status);
}
}
}
代码说明:
首先把配置文档中定义的 dataSource,通过 JdbcTemplate 的构造方法进行注入,然
后直接执行 JdbcTemplate的 update()方法即可实现对数据库的操作,是不是比传
统的 Jdbc方式简单多了,只用了 2行代码就实现了执行数据库的操作。
(3)开发人员还可以把配置文档中定义的 dataSource,通过 JdbcTemplate的构造方法进行
注入也省掉,直接把 JdbcTemplate在配置文档中配置,并使 JdbcTemplate依赖于 dataSource,
配置文档的示例代码如下:
<?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">
<!—使用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>
<!—设定jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!—示例中的一个DAO -->
<bean id="helloDAO" class="com.gc.action.HelloDAO">
<property name=" jdbcTemplate ">
<ref bean=" jdbcTemplate "/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>
</beans>
代码说明:
这里把 jdbcTemplate通过配置文档定义,把 dataSource注入到 jdbcTemplate中。
把 jdbcTemplate通过配置注入到 HelloDAO中。
(4)在类HelloDAO 中使用 JdbcTemplate ,但是不用编写代码把 dataSource 注入到
jdbcTemplate中,并和事务处理结合在一起,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.*;
import org.springframework.jdbc.core.JdbcTemplate;
public class HelloDAO {
private JdbcTemplate jdbcTemplate;
private PlatformTransactionManager transactionManager;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
//这里把jdbcTemplate通过依赖注入来实现
public int create(String msg) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
jdbcTemplate.update("INSERT INTO hello VALUES(1, 'gf', 'HelloWord')");
} catch (DataAccessException ex) {
// 也可以執行status.setRollbackOnly();
transactionManager.rollback(status);
throw ex;
} final y {
transactionManager.commit(status);
}
}
}
这里只有 1行代码就实现了对数据库的操作,由此可以看出 Spring IoC功能的强大,通过依赖注入,大大简化了开发人员的编码工作量,而且在 Spring 的配置文档中配置也是非常容
易的。
(5)开发人员甚至还可以 sql 语句也通过配置文档来进行配置,这样当需要更改 sql语句时,就不需要改变代码了,而只需要修改配置文档。通过配置文档进行 sql 语句注入的示例代码如下:
<?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">
<!—使用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>
<!—设定jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="helloDAO" class="com.gc.action.HelloDAO">
<property name=" jdbcTemplate ">
<ref bean=" jdbcTemplate "/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="sql">
<value> INSERT INTO hello VALUES(1, 'gf', 'HelloWord')</value>
</property>
</bean>
</beans>
代码说明:
把 sql语句通过 IoC注入到 HelloDAO中。
(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.*;
import org.springframework.jdbc.core.JdbcTemplate;
public class HelloDAO {
private JdbcTemplate jdbcTemplate;
private PlatformTransactionManager transactionManager;
private String sql;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void setSql(String sql) {
this.sql = sql;
}
//把sql语句也通过依赖注入的方式来实现
public int create(String msg) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
jdbcTemplate.update(this.sql);
} catch (DataAccessException ex) {
transactionManager.rollback(status); // 也可以執行status.setRollbackOnly();
throw ex;
} final y {
transactionManager.commit(status);
}
}
}
上述 3种方式都实现了同样的功能,当业务逻辑调用类 HelloDAO中的 create()方法时,都会向数据库增加一笔数据,而且代码量逐渐的减少,因为在 Spring 的配置文档中都通过
依赖注入来进行设值。