在上篇笔记中,说道使用JDBC存取数据库时,流程大体相同,反复使用较为繁琐。因此Spring采用了Template-Callback模式来简化JDBC使用时的流程。
Spring提供了org.springframework.jdbc.core.JdbcTemplate类,它被设计为线程安全,它提供的一些操作方法封装了JDBC流程。使用JdbcTemplate,首先需要一个DataSource对象作为构造对象:JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource)。然后就可以使用JdbcTemplate提供的update/execute/query等系列方法执行具体存取操作了。省去了自己建立连接、创建statement等。
DAO实现类中需有注入DataSource的方法,此方法使用dataSource初始化JdbcTemplate。
Bean定义文件中进行配置:
接着对JdbcTemplate的常用方法进行分类介绍如下:
1. 执行静态陈述
public void execute(final String sql):执行DDL statement,包括create table/index,alter table/index,drop table/index。
2. 更新表格:DML statement-insert,update,delete。使用update系列函数
3. 查询.使用queryForXXX系列
对查询结果进行封装-ORM(对象关系映射)。除了上面提到的使用RowCallbackHandler进行关系-对象映射,还可以使用org.springframework.jdbc.core.RowMapper接口,实现单行、多行封装。使用例子如下:
4. 存取Lob
在JDBC中可以使用Clob(character large object-文字文本文件)与Blob(Binary large object-图像等二进制文件),JdbcTemplate也可以进行大对象的便捷存取。储存大对象使用 public <T> T execute(String sql, PreparedStatementCallback<T> action)方法,读取大对象使用 public <T> T query(String sql, Object[] args, ResultSetExtractor<T> rse)。具体过程如下:
在建立org.springframework.jdbc.core.support.AbstractLobCreatingPreparedStatementCallback(抽象类)对象时,需传递一个接口org.springframework.jdbc.support.lob.LobHandler实例,对于MySQL、SQL Server、Oracle 10g,LobHander实例使用org.springframework.jdbc.support.lob.DefaultLobHandler。对于oracle 9i可以使用OracleLobHandler。在setValues()方法实现中,使用org.springframework.jdbc.support.lob.LobCreator分别设置Blob与Clob的来源串流,索引1/2表示第一与第二个占位字符'?'的位置,并指定读取长度。
从数据库读取大对象文件时,使用了org.springframework.util.FileCopyUtils的copy方法,将LobHandler取的串流直接转接给文件输出FileWriter/FileOutputStream对象。
下面贴出,抽象类AbstractLobCreatingPreparedStatementCallback的部分定义、接口LobCreator的方法、抽象类AbstractLobStreamingResultSetExtractor部分定义、抽象类FileCopyUtils的copy方法、接口LobHandler的部分方法。