日期:2014-05-16 浏览次数:20622 次
JdbcTemplate
类JdbcTemplate
是core包的核心类。它替我们完成了资源的创建以及释放工作,从而简化了我们对JDBC的使用。 它还可以帮助我们避免一些常见的错误,比如忘记关闭数据库连接。 JdbcTemplate将完成JDBC核心处理流程,比如SQL语句的创建、执行,而把SQL语句的生成以及查询结果的提取工作留给我们的应用代码。 它可以完成SQL查询、更新以及调用存储过程,可以对ResultSet
进行遍历并加以提取。 它还可以捕获JDBC异常并将其转换成org.springframework.dao
包中定义的,通用的,信息更丰富的异常。
使用JdbcTemplate进行编码只需要根据明确定义的一组契约来实现回调接口。 PreparedStatementCreator
回调接口通过给定的Connection
创建一个PreparedStatement,包含SQL和任何相关的参数。 CallableStatementCreateor
实现同样的处理,只不过它创建的是CallableStatement。 RowCallbackHandler
接口则从数据集的每一行中提取值。
我们可以在DAO实现类中通过传递一个DataSource
引用来完成JdbcTemplate的实例化,也可以在Spring的IoC容器中配置一个JdbcTemplate的bean并赋予DAO实现类作为一个实例。 需要注意的是DataSource
在Spring的IoC容器中总是配制成一个bean,第一种情况下,DataSource
bean将传递给service,第二种情况下DataSource
bean传递给JdbcTemplate bean。
最后,JdbcTemplate中使用的所有SQL将会以“DEBUG”级别记入日志(一般情况下日志的category是JdbcTemplate
相应的全限定类名,不过如果需要对JdbcTemplate
进行定制的话,可能是它的子类名)。
下面是一些使用JdbcTemplate
类的示例。(这些示例并不是完整展示所有的JdbcTemplate
所暴露出来的功能。请查看与之相关的Javadoc)。
一个简单的例子用于展示如何获取一个表中的所有行数。
int rowCount = this.jdbcTemplate.queryForInt("select count(0) from t_accrual");
一个简单的例子展示如何进行参数绑定。
int countOfActorsNamedJoe = this.jdbcTemplate.queryForInt( "select count(0) from t_actors where first_name = ?", new Object[]{"Joe"});
查询一个String
。
String surname = (String) this.jdbcTemplate.queryForObject( "select surname from t_actor where id = ?", new Object[]{new Long(1212)}, String.class);
查询并将结果记录为一个简单的数据模型。
Actor actor = (Actor) this.jdbcTemplate.queryForObject( "select first_name, surname from t_actor where id = ?", new Object[]{new Long(1212)}, new RowMapper() { public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Actor actor = new Actor(); actor.setFirstName(rs.getString("first_name")); actor.setSurname(rs.getString("surname")); return actor; } });
查询并组装多个数据模型。
Collection actors = this.jdbcTemplate.query( "select first_name, surname from t_actor", new RowMapper() { public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Actor actor = new Actor(); actor.setFirstName(rs.getString("first_name")); actor.setSurname(rs.getString("surname")); return actor; } });
如果最后2个示例中的代码出现在同一段程序中,我们有必要去掉这些重复的RowMapper
匿名类代码,将这些代码抽取到一个单独的类中(通常是一个静态的内部类)。 这样,这个内部类就可以在DAO的方法中被共享。因而,最后2个示例写成如下的形式将更加好:
public Collection findAllActors() { return this.jdbcTemplate.query( "select first_name, surname from t_actor", new ActorMapper()); } private static final class ActorMapper implements RowMapper { public Object mapRow(Result