何时使用Spring batchUpdate,何时在BatchPreparedStatementSetter上使用ParameterizedPreparedStatementSetter?

时间:2019-06-12 19:44:31

标签: java spring jdbc

我现在对在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。发行

1 个答案:

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

希望这能回答您的问题。