日期:2014-05-16  浏览次数:20705 次

【第七章】 对JDBC的支持 之 7.2 JDBC模板类 ——跟我学spring3

?

7.2? JDBC模板类

7.2.1? 概述

?????? Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式。

?

?????? JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做需要做的事情(即可变部分),并且帮我们做哪些固定部分,如连接的创建及关闭。

?

?????? JdbcTemplate类对可变部分采用回调接口方式实现,如ConnectionCallback通过回调接口返回给用户一个连接,从而可以使用该连接做任何事情、StatementCallback通过回调接口返回给用户一个Statement,从而可以使用该Statement做任何事情等等,还有其他一些回调接口如图7-3所示。

?

图7-3 JdbcTemplate支持的回调接口

?

Spring除了提供JdbcTemplate核心类,还提供了基于JdbcTemplate实现的NamedParameterJdbcTemplate类用于支持命名参数绑定、?SimpleJdbcTemplate类用于支持Java5+的可变参数及自动装箱拆箱等特性。

?

7.2.3??????? ?传统JDBC编程替代方案

前边我们已经使用过传统JDBC编程方式,接下来让我们看下Spring JDBC框架提供的更好的解决方案。

1)准备需要的jar包并添加到类路径中:

?

java代码:
//JDBC抽象框架模块
org.springframework.jdbc-3.0.5.RELEASE.jar     
//Spring事务管理及一致的DAO访问及非检查异常模块 
org.springframework.transaction-3.0.5.RELEASE.jar 
//hsqldb驱动,hsqldb是一个开源的Java实现数据库,请下载hsqldb2.0.0+版本
hsqldb.jar

?

2)传统JDBC编程替代方案:

在使用JdbcTemplate模板类时必须通过DataSource获取数据库连接,Spring JDBC提供了DriverManagerDataSource实现,它通过包装“DriverManager.getConnection”获取数据库连接,具体DataSource相关请参考【7.5.1控制数据库连接】。

?

java代码:
package cn.javass.spring.chapter7;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class JdbcTemplateTest {
    private static JdbcTemplate jdbcTemplate;
    @BeforeClass
    public static void setUpClass() {
        String url = "jdbc:hsqldb:mem:test";
        String username = "sa";
        String password = "";
        DriverManagerDataSource dataSource = new DriverManagerDataSource(url, username, password);
        dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
        jdbcTemplate = new JdbcTemplate(dataSource);
    }
    @Test
    public void test() {
        //1.声明SQL
        String sql = "select * from INFORMATION_SCHEMA.SYSTEM_TABLES";
        jdbcTemplate.query(sql, new RowCallbackHandler() {
            @Override
            public void processRow(ResultSet rs) throws SQLException {
                //2.处理结果集
                String value = rs.getString("TABLE_NAME");
                System.out.println("Column TABLENAME:" + value);
            }
        });
    }
}
 


接下来让我们具体分析一下:

1)??jdbc:hsqldb:mem:test表示使用hsqldb内存数据库,数据库名为“test”。

2)??public static void setUpClass()使用junit的@BeforeClass注解,表示在所以测试方法之前执行,且只执行一次。在此方法中定义了DataSource并使用DataSource对象创建了JdbcTemplate对象。JdbcTemplate对象是线程安全的。