日期:2014-05-16 浏览次数:20705 次
?
?????? Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式。
?
?????? JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做需要做的事情(即可变部分),并且帮我们做哪些固定部分,如连接的创建及关闭。
?
?????? JdbcTemplate类对可变部分采用回调接口方式实现,如ConnectionCallback通过回调接口返回给用户一个连接,从而可以使用该连接做任何事情、StatementCallback通过回调接口返回给用户一个Statement,从而可以使用该Statement做任何事情等等,还有其他一些回调接口如图7-3所示。
?
图7-3 JdbcTemplate支持的回调接口
?
Spring除了提供JdbcTemplate核心类,还提供了基于JdbcTemplate实现的NamedParameterJdbcTemplate类用于支持命名参数绑定、?SimpleJdbcTemplate类用于支持Java5+的可变参数及自动装箱拆箱等特性。
前边我们已经使用过传统JDBC编程方式,接下来让我们看下Spring JDBC框架提供的更好的解决方案。
1)准备需要的jar包并添加到类路径中:
?
//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控制数据库连接】。
?
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对象是线程安全的。