NamedParameterJdbcTemplate与JdbcTemplate

Ash*_*hok 36 java spring jdbc spring-jdbc jdbctemplate

我是Spring3.x的初学者,我正在学习Spring DAO的支持.我想知道NamedParameterJdbcTemplate和JdbcTemplate之间的区别.通过表现哪一个是最好的.什么时候去NamedParameterJdbcTemplate,什么时候去JdbcTemplate.你的答案对我这样的初学者有很大的帮助.

Nat*_*hes 64

当您使用JdbcTemplate时,您可以为其提供一个SQL,该SQL具有?要替换为SQL的每个参数的占位符.在代码中分配参数时,必须在数组中传入参数,并按照它们在数组中出现的顺序使用它们,如下所示:

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

所以运行的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);
Run Code Online (Sandbox Code Playgroud)

生成与第一个示例相同的SQL(并且运行查询是时间密集型部分,参数插入的性能不是问题.).

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

  • @Sarma:这不是一个非常具体的问题.如果您想了解更多详细信息,可以查看源代码. (4认同)
  • @MaxG Spring JdbcTemplate在NamedParameterJdbcTemplate中公开,以允许通过getJdbcOperations()方法从底层JdbcTemplate调用方法.所以你不需要同时创建它们. (4认同)
  • @Max:没有共享状态 (2认同)
  • “**在现实应用程序中,通常 SQL 存储在与 DAO 不同的文件中**”我同意这是一个很好的方法,但是我从未见过这种情况 (2认同)

Xen*_*son 5

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