hibernatetemplate的bulkupdate有什么作用?

3

hibernatetemplate的bulkUpdate方法是否真的执行了批量更新操作呢?我查看了代码,似乎并没有执行批量更新操作。或者是我漏看了什么吗?

public int bulkUpdate(final String queryString, final Object... values) throws DataAccessException {
        return executeWithNativeSession(new HibernateCallback<Integer>() {
            public Integer doInHibernate(Session session) throws HibernateException {
                Query queryObject = session.createQuery(queryString);
                prepareQuery(queryObject);
                if (values != null) {
                    for (int i = 0; i < values.length; i++) {
                        queryObject.setParameter(i, values[i]);
                    }
                }
                return queryObject.executeUpdate();
            }
        });
    }

与之相比,JdbcTemplate batchUpdate(看起来)执行的是一个批量更新操作。

public int[] batchUpdate(final String[] sql) throws DataAccessException {
        Assert.notEmpty(sql, "SQL array must not be empty");
        if (logger.isDebugEnabled()) {
            logger.debug("Executing SQL batch update of " + sql.length + " statements");
        }
        class BatchUpdateStatementCallback implements StatementCallback<int[]>, SqlProvider {
            private String currSql;
            public int[] doInStatement(Statement stmt) throws SQLException, DataAccessException {
                int[] rowsAffected = new int[sql.length];
                if (JdbcUtils.supportsBatchUpdates(stmt.getConnection())) {
                    for (String sqlStmt : sql) {
                        this.currSql = sqlStmt;
                        stmt.addBatch(sqlStmt);
                    }
                    rowsAffected = stmt.executeBatch();
                }
                else {
                    for (int i = 0; i < sql.length; i++) {
                        this.currSql = sql[i];
                        if (!stmt.execute(sql[i])) {
                            rowsAffected[i] = stmt.getUpdateCount();
                        }
                        else {
                            throw new InvalidDataAccessApiUsageException("Invalid batch SQL statement: " + sql[i]);
                        }
                    }
                }
                return rowsAffected;
            }
            public String getSql() {
                return this.currSql;
            }
        }
        return execute(new BatchUpdateStatementCallback());
    }
1个回答

0

是的,它正在执行批量更新。正如您所看到的,DELETEINSERT 查询在 bulkUpdate 方法中执行时可能影响多行。这就是为什么它们被称为批量操作。

关键是要有方便的方法来执行更新和查询,并返回批量操作中受影响的行数。此外,它将异常包装到 DataAccessException 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接