NamedParameterJdbcTemplate类
NamedParameterJdbcTemplate
类增加了在SQL语句中使用命名参数的支持。在此之前,在传统的SQL语句中,参数都是用'?'
占位符来表示的。 NamedParameterJdbcTemplate
类内部封装了一个普通的JdbcTemplate
,并作为其代理来完成大部分工作。下面的内容主要针对NamedParameterJdbcTemplate
与JdbcTemplate
的不同之处来加以说明,即如何在SQL语句中使用命名参数。
通过下面的例子我们可以更好地了解NamedParameterJdbcTemplate
的使用模式(在后面我们还有更好的使用方式)。
// some JDBC-backed DAO class... public int countOfActorsByFirstName(String firstName) { String sql = "select count(0) from T_ACTOR where first_name = :first_name"; NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource()); SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName); return template.queryForInt(sql, namedParameters); }
在上面例子中,sql
变量使用了命名参数占位符“first_name”,与其对应的值存在namedParameters
变量中(类型为MapSqlParameterSource
)。
如果你喜欢的话,也可以使用基于Map风格的名值对将命名参数传递给NamedParameterJdbcTemplate
(NamedParameterJdbcTemplate
实现了NamedParameterJdbcOperations
接口,剩下的工作将由调用该接口的相应方法来完成,这里我们就不再赘述):
// some JDBC-backed DAO class... public int countOfActorsByFirstName(String firstName) { String sql = "select count(0) from T_ACTOR where first_name = :first_name"; NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource()); Map namedParameters = new HashMap(); namedParameters.put("first_name", firstName); return template.queryForInt(sql, namedParameters); }
另外一个值得一提的特性是与NamedParameterJdbcTemplate
位于同一个包中的SqlParameterSource
接口。在前面的代码片断中我们已经看到了该接口的实现(即MapSqlParameterSource
类),SqlParameterSource
可以用来作为NamedParameterJdbcTemplate
命名参数的来源。MapSqlParameterSource
类是一个非常简单的实现,它仅仅是一个java.util.Map
适配器,当然其用法也就不言自明了(如果还有不明了的,可以在Spring的JIRA系统中要求提供更多的相关资料)。
大家必须牢记一点:NamedParameterJdbcTemplate
类内部包装了一个标准的JdbcTemplate
类。如果你需要访问其内部的JdbcTemplate
实例(比如访问JdbcTemplate
的一些方法)那么你需要使用getJdbcOperations()
方法返回的JdbcOperations
接口。(JdbcTemplate
实现了JdbcOperations
接口)。
NamedParameterJdbcTemplate
类是线程安全的,该类的最佳使用方式不是每次操作的时候实例化一个新的NamedParameterJdbcTemplate
,而是针对每个DataSource
只配置一个NamedParameterJdbcTemplate
实例(比如在Spring IoC容器中使用Spring IoC来进行配置),然后在那些使用该类的DAO中共享该实例。