Update KeyHolder in JdbcClient when using positional parameters

Prior to this commit, DefaultJdbcClient updated the supplied KeyHolder
when using named parameters but not for positional parameters.

This commit refactors the creation of the
PreparedStatementCreatorFactory so that the PreparedStatementCreator
properly creates a PreparedStatement which returns generated keys.

Closes gh-31297
This commit is contained in:
Sam Brannen
2023-09-22 17:21:16 +02:00
parent 4841e52205
commit 64b4a3cf0d
2 changed files with 126 additions and 2 deletions

View File

@@ -242,7 +242,7 @@ final class DefaultJdbcClient implements JdbcClient {
public int update(KeyHolder generatedKeyHolder) {
return (useNamedParams() ?
namedParamOps.update(this.sql, this.namedParamSource, generatedKeyHolder) :
classicOps.update(getPreparedStatementCreatorForIndexedParams(), generatedKeyHolder));
classicOps.update(getPreparedStatementCreatorForIndexedParams(true), generatedKeyHolder));
}
private boolean useNamedParams() {
@@ -258,7 +258,13 @@ final class DefaultJdbcClient implements JdbcClient {
}
private PreparedStatementCreator getPreparedStatementCreatorForIndexedParams() {
return new PreparedStatementCreatorFactory(this.sql).newPreparedStatementCreator(this.indexedParams);
return getPreparedStatementCreatorForIndexedParams(false);
}
private PreparedStatementCreator getPreparedStatementCreatorForIndexedParams(boolean returnGeneratedKeys) {
PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory(this.sql);
factory.setReturnGeneratedKeys(returnGeneratedKeys);
return factory.newPreparedStatementCreator(this.indexedParams);
}