当前位置: 首页 > 知识库问答 >
问题:

NamedParameterJdbcTemplate与JdbcTemplate

沈宏朗
2023-03-14

我是Spring3的初学者。我正在学习Spring DAO支持。我想知道名参数JdbcTemplate和JdbcTemplate之间的区别。从性能来看,哪一个是最好的。以及何时选择命名参数JdbcTemplate,何时选择JdbcTemplate。

共有2个答案

顾单弓
2023-03-14

没有可测量的性能差异。NamedParameterJdbcTemplate非常方便,允许您使用命名参数。如果您真的很好奇,请看一下可供下载的源代码。我发现阅读源代码让我对论坛上得到的答案更有信心。

连俊智
2023-03-14

当您使用JdbcTemplate时,您为它提供了一个SQL,其中包含一个<代码> 占位符。在代码中指定参数时,必须在数组中传入参数,并按照参数在数组中出现的顺序使用参数,如下所示:

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

因此,运行的SQL是从foo中选择*,其中a=‘x’和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代码存储在一个单独的文件中,可能很容易意外地以错误的顺序获取参数。

 类似资料:
  • org.springframework.jdbc.core.NamedParameterJdbcTemplate类是一个带有一组基本JDBC操作的模板类,允许使用命名参数而不是传统的'?' 占位符。 一旦从命名参数替换为JDBC样式'?',此类将委托给包装好的JdbcTemplate 占位符在执行时完成。 它还允许将值列表扩展到适当数量的占位符。 接口声明 (Interface Declarati

  • org.springframework.jdbc.core.NamedParameterJdbcTemplate类是一个带有一组基本JDBC操作的模板类,允许使用命名参数而不是传统的'?' 占位符。 一旦从命名参数替换为JDBC样式'?',此类将委托给包装好的JdbcTemplate 占位符在执行时完成。 它还允许将值列表扩展到适当数量的占位符。 接口声明 (Interface Declarati

  • 我已经成功地使用了BatchSqlUpdate类一段时间了。使用它唯一的麻烦是,在使用declarepareter或setParameter方法运行任何查询之前,需要注册命名参数。这意味着也必须声明参数的类型。然而,Spring还提供了一个名为NamedParameterJdbcTemplate的类,该类有一个非常方便的Batch Update方法,该方法将命名参数作为输入(一组映射或SqlPar

  • 我正在处理一个问题,该问题涉及我编写一个查询以从数据库中获取数千条记录。我将使用的查询将在WHERE条件中包含2个IN子句。 根据我的知识可能有限,请您纠正我,对于这个用例,我不能使用jdbctemplate。我必须转向NamedParameterJdbcTemplate,因为NamedParameterJdbcTemplate为我们提供了使用IN子句的灵活性。 现在我想回答的问题如下。 Q Q

  • 我正在使用spring将批处理记录插入数据库。但我得到了一个错误:java。sql。SQLException:无法在java之间转换。util。ArrayList和JAVA\u对象。你能帮帮我吗?我做错什么了 错误: 如果使用硬编码值: 或者当我只通过一个int时,它就起作用了。 请帮忙:)

  • 尝试对定义为以下内容的方法进行单元测试: 在我的测试类中,我将测试方法定义为 当运行这个测试方法时,我在调用的方法(mymethod())中得到NullPointerExcishop。int[]结果是空的。我的理解是它应该从模拟中的存根中得到结果。请帮助我理解我做错了什么。