46785


Spring JDBC の batchUpdate についてです。

[code]

    public int[] org.springframework.jdbc.core.JdbcTemplate.batchUpdate(java.lang.String sql,
                         java.util.List<java.lang.Object[]> batchArgs)
                  throws DataAccessException
    
[/code]

こちらのメソッドを利用するとUpdate件数を格納したint型の配列が返りますが、この配列の順序は引数 `batchArgs`
の順序と一致しているのでしょうか？

例としては、  
- batchArgs.get(0)のupdate件数が、戻り値[0]に格納  
- batchArgs.get(1)のupdate件数が、戻り値[1]に格納  
- batchArgs.get(2)のupdate件数が、戻り値[2]に格納  
といったようになっているかどうかです。

javadocを確認しましたが明記はされていないように見受けられましたので、ご存じある方がいらっさいましたらご教授いただきたく思います。  
また明記されているサイトをご存じある方がいらっしゃいましたら教えていただきたく思います。


CC BY-SA 4.0
2018-07-20T01:41:36.507
46751
2018-07-20T10:23:22.620
question
java spring jdbc
Spring JDBC の batchUpdate の戻り値の順序について教えてください


Spring JDBCにバグが無ければ、一致しているはずです（が、何か想定外の結果が返ってきましたか？）。


CC BY-SA 4.0
2018-07-20T04:54:34.547
46765
2018-07-20T04:54:34.547
21092
46751
answer


> この配列の順序は引数 batchArgs の順序と一致しているのでしょうか？

一致すると思います。

[batchUpdate](https://docs.spring.io/spring/docs/current/javadoc-
api/org/springframework/jdbc/core/JdbcTemplate.html#batchUpdate-
java.lang.String-java.util.List-)の`Returns:`には、以下の記載があり、`each update in the
batch`が`batchArgs`にあたるのだと思います。

> an array containing the numbers of rows affected by each update in the batch

ただ、英語が苦手なので、ソースも確認してみましたが、 batchArgs の順序と一致していました。

* * *

以下は細かいですが、ソースの解析結果です。

[batchUpdate(String sql, List batchArgs)](https://github.com/spring-
projects/spring-framework/blob/v5.0.7.RELEASE/spring-
jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java#L968)は、

  * [BatchUpdateUtils.executeBatchUpdate](https://github.com/spring-projects/spring-framework/blob/v5.0.7.RELEASE/spring-jdbc/src/main/java/org/springframework/jdbc/core/BatchUpdateUtils.java#L34)を呼びだし、

  * 最後に[batchUpdate(String sql, final BatchPreparedStatementSetter  
pss)](https://github.com/spring-projects/spring-
framework/blob/v5.0.7.RELEASE/spring-
jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java#L919)を呼びだします

そして、[batchUpdate(String sql, final BatchPreparedStatementSetter
pss)](https://github.com/spring-projects/spring-
framework/blob/v5.0.7.RELEASE/spring-
jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java#L919)は、

  * [JDBC driverがJDBC 2.0 batch updatesをサポートしている場合](https://github.com/spring-projects/spring-framework/blob/v5.0.7.RELEASE/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java#L930)は、[Statement.executeBatch](https://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#executeBatch\(\))を実行し、その結果が`batchUpdate`の戻り値となります。  
[Statement.executeBatch](https://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#executeBatch\(\))の戻り値はJavaDocに配列の順序を明記されているため、
**batchArgs の順序と一致** します。  
`an array of update counts containing one element for each command in the
batch. The elements of the array are ordered according to the order in which
commands were added to the batch.`

  * [JDBC driverがJDBC 2.0 batch updatesをサポートしていない場合](https://github.com/spring-projects/spring-framework/blob/v5.0.7.RELEASE/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java#L940)は、`batchArgs`の順にSQLを実行しその結果を戻り値に格納しています。そのため、 **batchArgs の順序と一致** します。


CC BY-SA 4.0
2018-07-20T10:23:22.620
46785
2018-07-20T10:23:22.620
46751
answer