Introduce update variant with KeyHolder and explicit key column names

Closes gh-31607
This commit is contained in:
Juergen Hoeller
2023-11-15 12:20:22 +01:00
parent 510caad6c3
commit 01fc1ee3bb
5 changed files with 129 additions and 17 deletions

View File

@@ -339,7 +339,7 @@ public class JdbcClientIndexedParameterTests {
}
@Test
public void updateAndGeneratedKeys() throws SQLException {
public void updateWithGeneratedKeys() throws SQLException {
given(resultSetMetaData.getColumnCount()).willReturn(1);
given(resultSetMetaData.getColumnLabel(1)).willReturn("1");
given(resultSet.getMetaData()).willReturn(resultSetMetaData);
@@ -362,4 +362,28 @@ public class JdbcClientIndexedParameterTests {
verify(connection).close();
}
@Test
public void updateWithGeneratedKeysAndKeyColumnNames() throws SQLException {
given(resultSetMetaData.getColumnCount()).willReturn(1);
given(resultSetMetaData.getColumnLabel(1)).willReturn("1");
given(resultSet.getMetaData()).willReturn(resultSetMetaData);
given(resultSet.next()).willReturn(true, false);
given(resultSet.getObject(1)).willReturn(11);
given(preparedStatement.executeUpdate()).willReturn(1);
given(preparedStatement.getGeneratedKeys()).willReturn(resultSet);
given(connection.prepareStatement(INSERT_GENERATE_KEYS, new String[] {"id"}))
.willReturn(preparedStatement);
KeyHolder generatedKeyHolder = new GeneratedKeyHolder();
int rowsAffected = client.sql(INSERT_GENERATE_KEYS).param("rod").update(generatedKeyHolder, "id");
assertThat(rowsAffected).isEqualTo(1);
assertThat(generatedKeyHolder.getKeyList()).hasSize(1);
assertThat(generatedKeyHolder.getKey()).isEqualTo(11);
verify(preparedStatement).setString(1, "rod");
verify(resultSet).close();
verify(preparedStatement).close();
verify(connection).close();
}
}

View File

@@ -34,16 +34,18 @@ import static org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType.
* Integration tests for {@link JdbcClient} using an embedded H2 database.
*
* @author Sam Brannen
* @author Juergen Hoeller
* @since 6.1
* @see JdbcClientIndexedParameterTests
* @see JdbcClientNamedParameterTests
*/
class JdbcClientIntegrationTests {
private static final String INSERT_WITH_JDBC_PARAMS =
"INSERT INTO users (first_name, last_name) VALUES(?, ?)";
private static final String INSERT_WITH_NAMED_PARAMS =
"INSERT INTO users (first_name, last_name) VALUES(:firstName, :lastName)";
private static final String INSERT_WITH_POSITIONAL_PARAMS =
"INSERT INTO users (first_name, last_name) VALUES(?, ?)";
private final EmbeddedDatabase embeddedDatabase =
@@ -66,15 +68,16 @@ class JdbcClientIntegrationTests {
this.embeddedDatabase.shutdown();
}
@Test
void updateWithGeneratedKeysAndPositionalParameters() {
void updateWithGeneratedKeys() {
int expectedId = 2;
String firstName = "Jane";
String lastName = "Smith";
KeyHolder generatedKeyHolder = new GeneratedKeyHolder();
int rowsAffected = this.jdbcClient.sql(INSERT_WITH_POSITIONAL_PARAMS)
int rowsAffected = this.jdbcClient.sql(INSERT_WITH_JDBC_PARAMS)
.params(firstName, lastName)
.update(generatedKeyHolder);
@@ -85,7 +88,25 @@ class JdbcClientIntegrationTests {
}
@Test
void updateWithGeneratedKeysAndNamedParameters() {
void updateWithGeneratedKeysAndKeyColumnNames() {
int expectedId = 2;
String firstName = "Jane";
String lastName = "Smith";
KeyHolder generatedKeyHolder = new GeneratedKeyHolder();
int rowsAffected = this.jdbcClient.sql(INSERT_WITH_JDBC_PARAMS)
.params(firstName, lastName)
.update(generatedKeyHolder, "id");
assertThat(rowsAffected).isEqualTo(1);
assertThat(generatedKeyHolder.getKey()).isEqualTo(expectedId);
assertNumUsers(2);
assertUser(expectedId, firstName, lastName);
}
@Test
void updateWithGeneratedKeysUsingNamedParameters() {
int expectedId = 2;
String firstName = "Jane";
String lastName = "Smith";
@@ -103,6 +124,26 @@ class JdbcClientIntegrationTests {
assertUser(expectedId, firstName, lastName);
}
@Test
void updateWithGeneratedKeysAndKeyColumnNamesUsingNamedParameters() {
int expectedId = 2;
String firstName = "Jane";
String lastName = "Smith";
KeyHolder generatedKeyHolder = new GeneratedKeyHolder();
int rowsAffected = this.jdbcClient.sql(INSERT_WITH_NAMED_PARAMS)
.param("firstName", firstName)
.param("lastName", lastName)
.update(generatedKeyHolder, "id");
assertThat(rowsAffected).isEqualTo(1);
assertThat(generatedKeyHolder.getKey()).isEqualTo(expectedId);
assertNumUsers(2);
assertUser(expectedId, firstName, lastName);
}
private void assertNumUsers(long count) {
long numUsers = this.jdbcClient.sql("select count(id) from users").query(Long.class).single();
assertThat(numUsers).isEqualTo(count);
@@ -113,6 +154,7 @@ class JdbcClientIntegrationTests {
assertThat(user).isEqualTo(new User(id, firstName, lastName));
}
record User(long id, String firstName, String lastName) {};
}

View File

@@ -406,7 +406,7 @@ class JdbcClientNamedParameterTests {
}
@Test
void updateAndGeneratedKeys() throws SQLException {
void updateWithGeneratedKeys() throws SQLException {
given(resultSetMetaData.getColumnCount()).willReturn(1);
given(resultSetMetaData.getColumnLabel(1)).willReturn("1");
given(resultSet.getMetaData()).willReturn(resultSetMetaData);
@@ -429,4 +429,28 @@ class JdbcClientNamedParameterTests {
verify(connection).close();
}
@Test
public void updateWithGeneratedKeysAndKeyColumnNames() throws SQLException {
given(resultSetMetaData.getColumnCount()).willReturn(1);
given(resultSetMetaData.getColumnLabel(1)).willReturn("1");
given(resultSet.getMetaData()).willReturn(resultSetMetaData);
given(resultSet.next()).willReturn(true, false);
given(resultSet.getObject(1)).willReturn(11);
given(preparedStatement.executeUpdate()).willReturn(1);
given(preparedStatement.getGeneratedKeys()).willReturn(resultSet);
given(connection.prepareStatement(INSERT_GENERATE_KEYS_PARSED, new String[] {"id"}))
.willReturn(preparedStatement);
KeyHolder generatedKeyHolder = new GeneratedKeyHolder();
int rowsAffected = client.sql(INSERT_GENERATE_KEYS).param("name", "rod").update(generatedKeyHolder, "id");
assertThat(rowsAffected).isEqualTo(1);
assertThat(generatedKeyHolder.getKeyList()).hasSize(1);
assertThat(generatedKeyHolder.getKey()).isEqualTo(11);
verify(preparedStatement).setString(1, "rod");
verify(resultSet).close();
verify(preparedStatement).close();
verify(connection).close();
}
}