Spring BatchSqlUpdate vs NamedParameterJdbcTemplate使用命名参数

时间:2013-03-07 17:18:01

标签: spring jdbc sql-update batch-processing

我已成功使用BatchSqlUpdate课程一段时间了。使用它的唯一烦恼是在使用declareParametersetParameter方法运行任何查询之前需要注册命名参数。这意味着还必须声明参数的类型。但是,Spring还提供了一个NamedParameterJdbcTemplate类,它有一个非常方便的batchUpdate方法,它将命名参数作为输入(一组地图或SqlParameterSource个对象)而不需要声明他们首先。最重要的是,这个类可以很容易地重用,我也相信它是线程安全的。 所以我对此有几个问题:

  • 执行(多次)批量更新的推荐方法是什么?
  • 为什么这个功能在两个表现不同的不同类中重复?
  • 如果BatchSqlUpdate没有,NamedParameterJdbcTemplate为什么需要声明参数?

感谢您的想法!

乔瓦尼

1 个答案:

答案 0 :(得分:2)

在做了一些研究之后,我得出了以下结论。

首先,我意识到NamedParameterJdbcTemplate类是唯一接受批量更新的命名参数的类。在Spring 3中添加了方法batchUpdate(String sql,Map[] batchValues)来实现这一目标。

BatchSqlUpdate类包含一个重写的update(Object... params)方法,将给定的语句参数添加到队列中,而不是立即执行它们,如javadoc中所述。这意味着只有在调用flush()方法或批量大小超过最大值时才会执行语句。此分类不支持命名参数,但它包含从updateByNamedParam()继承的SqlUpdate方法。这很不幸,因为这个方法允许为命名参数重用相同的映射,而NamedParameterJdbcTemplate.batchUpdate()方法需要一个映射数组,相关的开销,代码膨胀以及如果批量大小重用地图数组的复杂性是可变的。

我认为updateByNamedParam(Map paramMap)中的BatchSqlUpdate被覆盖版本的行为与update(Object... params)类似,但增加了对命名参数的支持。