gpt4 book ai didi

java - 何时使用 ParameterizedPreparedStatementSetter 而不是 BatchPreparedStatementSetter,反之亦然,使用 Spring batchUpdate?

转载 作者:行者123 更新时间:2023-12-02 04:32:54 25 4
gpt4 key购买 nike

我现在对在 jdbcTemplate.batchupdate 下使用 BatchPreparedStatementSetter 和 ParameterizedPreparedStatementSetter 使用 Spring 批量更新感到困惑。

我浏览了各种博客,甚至 spring 文档,但无法掌握其背后的概念。

在其中一篇博客 ( Spring JDBC performing batch update example ) 中,他们说:

ParameterizedPreparedStatementSetter: Using this, JdbcTemplate can execute multiple batch based on the batch size passed in the batchUpdate method.

BatchPreparedStatementSetter : Using this, JdbcTemplate will run only execute single batch based on the batch size returned by implementation this interface.

我想知道是否要将数据插入 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.RELEASE

最佳答案

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();
}
});
}

如果我们想将整个批处理插入到一批 block 中,那么将使用 BatchPreparedStatementSetter。使用 BatchPreparedStatementSetter 我们可以批量执行。这就是为什么它具有二维数组的返回类型。下面的代码将执行一批 users.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());
}
});
}

希望这能回答您的问题。

关于java - 何时使用 ParameterizedPreparedStatementSetter 而不是 BatchPreparedStatementSetter,反之亦然,使用 Spring batchUpdate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56569378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com