2013-03-07 50 views
4

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

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

谢谢你的想法!

Giovanni

回答

2

经过一番研究,我得出以下结论。

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

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

,我认为这将是有updateByNamedParam(Map paramMap)重写版本中BatchSqlUpdate表现就像update(Object... params)但与命名参数添加支持有用。