NamedParameterJdbcTemplate 与 JdbcTemplate

Posted

技术标签:

【中文标题】NamedParameterJdbcTemplate 与 JdbcTemplate【英文标题】:NamedParameterJdbcTemplate vs JdbcTemplate 【发布时间】:2013-04-27 21:08:39 【问题描述】:

我是 Spring3.x 的初学者,我正在学习 Spring DAO 支持。 我想知道NamedParameterJdbcTemplateJdbcTemplate 之间的区别。 就性能而言,哪一个是最好的。什么时候去NamedParameterJdbcTemplate 以及什么时候去JdbcTemplate

【问题讨论】:

这里有一篇文章举例说明区别:medium.com/@7anac/… 【参考方案1】:

没有可衡量的差异表现。 NamedParameterJdbcTemplate 是一种方便,允许您使用命名参数。 如果您真的很好奇,请查看可随时下载的源代码。 我发现阅读源代码让我对我在论坛上得到的答案更有信心。

【讨论】:

【参考方案2】:

当你使用 JdbcTemplate 时,你给它的 SQL 有一个? 占位符,代表你想要替换到 SQL 中的每个参数。当您在代码中分配参数时,您必须在数组中传递参数,并且它们会按照它们在数组中出现的顺序被使用,如下所示:

Object[] args = new Object[] "x", "y";
String sql = "select * from foo where a = ? and b = ?";
jdbcTemplate.query(sql, args, resultSetExtractor);

所以运行的 SQL 是 select * from foo where a = 'x' and b = 'y'

NamedParameterJdbcTemplate 允许您为参数占位符分配名称并传入映射,以便模板可以将映射名称与占位符匹配。所以你的代码看起来像:

String sql = "select * from foo where a = :mya and b = :myb";
Map<String, Object> argMap = new HashMap<String, Object>();
argMap.put("mya", "x");
argMap.put("myb", "y");
namedParameterJdbcTemplate.query(sql, argMap, resultSetExtractor);

生成与第一个示例相同的 SQL。

运行查询是耗时的部分,参数插入的性能不是问题。

这个想法是通过名称匹配参数比必须以特定顺序指定它们更不容易出错。在我从事的实际应用程序中,通常我们将 SQL 存储在与 DAO 代码不同的文件中,并且可能很容易意外地以错误的顺序获取参数。

【讨论】:

是否可以在同一个数据源中同时使用 NamedParameterJdbcTemplate 和 JdbcTemplate?他们会互相干扰吗? @Max: 没有共享状态 @MaxG Spring JdbcTemplate 在 NamedParameterJdbcTemplate 中公开,以允许通过 getJdbcOperations() 方法从底层 JdbcTemplate 调用方法。所以你不需要同时创建。 在实际应用程序中,SQL 通常存储在与 DAO 不同的文件中”我同意这是一个好方法,但是我从未见过跨度>

以上是关于NamedParameterJdbcTemplate 与 JdbcTemplate的主要内容,如果未能解决你的问题,请参考以下文章