首页 > 解决方案 > 以什么顺序为带有 RETURN_GENERATED_KEYS 标记的 jdbcOperations.execute 语句返回生成的 ID?

问题描述

我没有在官方文档中找到任何提及在 jdbcOperations.execute 方法中返回的生成 ID 的顺序。虽然知道顺序对我来说非常重要。

我有一个方法,它接受一个没有 ID 的对象列表,应该在生成后填充。如果生成的 ID 以与对象列表中相同的顺序返回,那么我可以遍历两个列表并将 ID 分配给对象。否则我需要使用返回的 ID 执行另一个选择查询,这会影响我的性能。

这是这种方法的示例:

public static List<Long> executeBatchInsert(final ParsedSql parsedSql, final SqlParameterSource[] batchArgs, JdbcOperations jdbcOperations) {

    if (batchArgs.length <= 0) {
        return Lists.newArrayList();
    }

    String sqlToUse = NamedParameterUtils.substituteNamedParameters(parsedSql, batchArgs[0]);

    BatchPreparedStatementSetter pss = new BatchPreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps, int i) throws SQLException {
            Object[] values = NamedParameterUtils.buildValueArray(parsedSql, batchArgs[i], null);
            int[] columnTypes = NamedParameterUtils.buildSqlTypeArray(parsedSql, batchArgs[i]);
            setStatementParameters(values, ps, columnTypes);
        }

        @Override
        public int getBatchSize() {
            return batchArgs.length;
        }
    };

    return jdbcOperations.execute(
            con -> con.prepareStatement(sqlToUse, Statement.RETURN_GENERATED_KEYS),
            (PreparedStatementCallback<List<Long>>) ps -> {
                int batchSize = pss.getBatchSize();
                for (int i = 0; i < batchSize; i++) {
                    pss.setValues(ps, i);
                    ps.addBatch();
                }
                ps.executeBatch();

                List<Long> result = new ArrayList<>();

                // Here I need to be sure that keys order is the same as in SqlParameterSource[] 
                ResultSet keys = ps.getGeneratedKeys();
                while (keys.next()) {
                    result.add(keys.getLong(1));
                }
                return result;
            });
}

标签: javamysqlspringjdbcspring-batch

解决方案


推荐阅读