我现在对在jdbcTemplate.batchupdate下使用BatchPreparedStatementSetter和ParameterizedPreparedStatementSetter使用春季批处理更新感到困惑。
我浏览过各种博客,甚至是春季文档,但无法掌握其背后的概念。
在其中一个博客(Spring JDBC performing batch update example)中,他们说:
ParameterizedPreparedStatementSetter :JdbcTemplate可以使用它来 根据传入的批次大小执行多个批次 batchUpdate方法。
BatchPreparedStatementSetter :使用此命令,JdbcTemplate将仅运行 根据返回的批次大小执行单个批次 实现此接口。
我想知道是否要将数据插入SQL Server DB。在幕后使用每个语句会有什么区别。他们会用以下方式发送数据库呼叫吗?
MULTIPLE INSERT CALLS BUT PREPARING STATEMENT ONCE
INSERT INTO TABLE VALUES(1,2,3)
INSERT INTO TABLE VALUES(2,3,5)
或
SINGLE INSERT WITH MULTIPLE VALUES AND PREPARING STATEMENT ONCE"
INSERT INTO TABLE VALUES(1,2,3),(2,3,5)
顺便说一句,我正在使用以下sqljdbc版本
<dependency>
<groupId>microsoft</groupId>
<artifactId>sqljdbc</artifactId>
<version>4</version>
</dependency>
和Spring版本:4.2.3。发行
答案 0 :(得分:0)
BatchPreparedStatementSetter和ParameterizedPreparedStatementSetter是spring提供的两个预付费语句。 BatchPreparedStatementSetter将一次执行整个批处理,即,如果我们有100条记录,BatchPreparedStatementSetter将一次插入所有记录。如果基础数据库没有更多内容,那么一次可能要说50条语句,这可能是一个问题。 这就是为什么它具有一维数组的返回类型。
@Override
public int[] batchInsertAll(List<User> users) {
return jdbcTemplate.batchUpdate(SQL_INSERT_USER, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, users.get(i).getFirstName());
ps.setString(2, users.get(i).getLastName());
}
@Override
public int getBatchSize() {
return users.size();
}
});
}
如果我们想将整个批次插入大批批次中,则将使用BatchPreparedStatementSetter。使用BatchPreparedStatementSetter,我们可以批量执行批处理。 这就是为什么它具有二维数组的返回类型。下面的代码将一批user.size语句执行为5。
@Override
public int[][] batchInsertAll(List<User> users) {
return jdbcTemplate.batchUpdate(SQL_INSERT_USER, users, 5, new ParameterizedPreparedStatementSetter<User>() {
@Override
public void setValues(PreparedStatement ps, User user) throws SQLException {
ps.setString(1, user.getFirstName());
ps.setString(2, user.getLastName());
}
});
}
希望这能回答您的问题。