【问题标题】:Spring BatchSqlUpdate vs NamedParameterJdbcTemplate using named parametersSpring BatchSqlUpdate vs NamedParameterJdbcTemplate 使用命名参数
【发布时间】:2013-02-23 00:41:26
【问题描述】:
我已经成功使用了一段时间的BatchSqlUpdate 类。使用它的唯一麻烦是在使用declareParameter 或setParameter 方法运行任何查询之前需要注册命名参数。这意味着也必须声明参数的类型。然而,Spring 也提供了一个NamedParameterJdbcTemplate 类,它有一个非常方便的batchUpdate 方法,它可以将命名参数作为输入(映射数组或SqlParameterSource 对象)无需先声明它们 .最重要的是,这个类可以很容易地重用,我也相信它是线程安全的。
所以我对此有几个问题:
- 执行(多个)批量更新的推荐方法是什么?
- 为什么此功能会在行为也不同的两个不同类中重复?
- 如果
NamedParameterJdbcTemplate 不需要,为什么BatchSqlUpdate 需要声明的参数?
感谢您的想法!
乔瓦尼
【问题讨论】:
标签:
spring
jdbc
sql-update
batch-processing
【解决方案1】:
经过一番研究,我得出以下结论。
首先,我意识到NamedParameterJdbcTemplate 类是唯一接受命名参数进行批量更新的类。在 Spring 3 中添加了 batchUpdate(String sql,Map[] batchValues) 方法来实现这一点。
BatchSqlUpdate 类包含一个重写的 update(Object... params) 方法,该方法将给定的语句参数添加到队列中,而不是立即执行它们,如 javadoc 中所述。这意味着只有在调用flush() 方法或批处理大小超过最大值时才会执行语句。这个类不支持命名参数,尽管它包含一个从SqlUpdate 继承的updateByNamedParam() 方法。这是不幸的,因为此方法允许为命名参数重用相同的映射,而NamedParameterJdbcTemplate.batchUpdate() 方法需要映射数组,如果批量大小可变,则具有相关的开销、代码膨胀和重用映射数组的复杂性.
我认为在BatchSqlUpdate 中覆盖updateByNamedParam(Map paramMap) 的版本以使其行为类似于update(Object... params) 但增加了对命名参数的支持会很有用。