Skip to content

Commit 2c7659f

Browse files
committed
Refactor JDBC DAOs to use JdbcClient where feasible
Closes GH-4804 Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
1 parent c121edd commit 2c7659f

5 files changed

Lines changed: 247 additions & 188 deletions

File tree

spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/AbstractJdbcBatchMetadataDao.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.core.convert.support.ConfigurableConversionService;
3333
import org.springframework.core.convert.support.DefaultConversionService;
3434
import org.springframework.jdbc.core.JdbcOperations;
35+
import org.springframework.jdbc.core.simple.JdbcClient;
3536
import org.springframework.util.Assert;
3637
import org.springframework.util.StringUtils;
3738

@@ -41,6 +42,7 @@
4142
*
4243
* @author Robert Kasanicky
4344
* @author Mahmoud Ben Hassine
45+
* @author Yanming Zhou
4446
*/
4547
public abstract class AbstractJdbcBatchMetadataDao implements InitializingBean {
4648

@@ -61,6 +63,8 @@ public abstract class AbstractJdbcBatchMetadataDao implements InitializingBean {
6163

6264
private @Nullable ConfigurableConversionService conversionService;
6365

66+
private @Nullable JdbcClient jdbcClient;
67+
6468
protected String getQuery(String base) {
6569
return StringUtils.replace(base, "%PREFIX%", tablePrefix);
6670
}
@@ -80,12 +84,17 @@ public void setTablePrefix(String tablePrefix) {
8084

8185
public void setJdbcTemplate(JdbcOperations jdbcTemplate) {
8286
this.jdbcTemplate = jdbcTemplate;
87+
this.jdbcClient = JdbcClient.create(jdbcTemplate);
8388
}
8489

8590
@Nullable protected JdbcOperations getJdbcTemplate() {
8691
return jdbcTemplate;
8792
}
8893

94+
@Nullable protected JdbcClient getJdbcClient() {
95+
return jdbcClient;
96+
}
97+
8998
public int getClobTypeToUse() {
9099
return clobTypeToUse;
91100
}
@@ -110,6 +119,7 @@ public void setConversionService(ConfigurableConversionService conversionService
110119
@Override
111120
public void afterPropertiesSet() throws Exception {
112121
Assert.state(jdbcTemplate != null, "JdbcOperations is required");
122+
Assert.state(jdbcClient != null, "JdbcClient is required");
113123
if (this.conversionService == null) {
114124
DefaultConversionService conversionService = new DefaultConversionService();
115125
conversionService.addConverter(new DateToStringConverter());

spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JdbcExecutionContextDao.java

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.util.Collection;
2828
import java.util.HashMap;
2929
import java.util.Iterator;
30-
import java.util.List;
3130
import java.util.Map;
3231
import java.util.Map.Entry;
3332
import java.util.concurrent.locks.Lock;
@@ -65,7 +64,7 @@ public class JdbcExecutionContextDao extends AbstractJdbcBatchMetadataDao implem
6564
private static final String FIND_JOB_EXECUTION_CONTEXT = """
6665
SELECT SHORT_CONTEXT, SERIALIZED_CONTEXT
6766
FROM %PREFIX%JOB_EXECUTION_CONTEXT
68-
WHERE JOB_EXECUTION_ID = ?
67+
WHERE JOB_EXECUTION_ID = :jobExecutionId
6968
""";
7069

7170
private static final String INSERT_JOB_EXECUTION_CONTEXT = """
@@ -82,7 +81,7 @@ public class JdbcExecutionContextDao extends AbstractJdbcBatchMetadataDao implem
8281
private static final String FIND_STEP_EXECUTION_CONTEXT = """
8382
SELECT SHORT_CONTEXT, SERIALIZED_CONTEXT
8483
FROM %PREFIX%STEP_EXECUTION_CONTEXT
85-
WHERE STEP_EXECUTION_ID = ?
84+
WHERE STEP_EXECUTION_ID = :stepExecutionId
8685
""";
8786

8887
private static final String INSERT_STEP_EXECUTION_CONTEXT = """
@@ -98,12 +97,12 @@ public class JdbcExecutionContextDao extends AbstractJdbcBatchMetadataDao implem
9897

9998
private static final String DELETE_STEP_EXECUTION_CONTEXT = """
10099
DELETE FROM %PREFIX%STEP_EXECUTION_CONTEXT
101-
WHERE STEP_EXECUTION_ID = ?
100+
WHERE STEP_EXECUTION_ID = :stepExecutionId
102101
""";
103102

104103
private static final String DELETE_JOB_EXECUTION_CONTEXT = """
105104
DELETE FROM %PREFIX%JOB_EXECUTION_CONTEXT
106-
WHERE JOB_EXECUTION_ID = ?
105+
WHERE JOB_EXECUTION_ID = :jobExecutionId
107106
""";
108107

109108
private Charset charset = StandardCharsets.UTF_8;
@@ -154,29 +153,24 @@ public ExecutionContext getExecutionContext(JobExecution jobExecution) {
154153
Long executionId = jobExecution.getId();
155154
Assert.notNull(executionId, "ExecutionId must not be null.");
156155

157-
List<ExecutionContext> results = getJdbcTemplate().query(getQuery(FIND_JOB_EXECUTION_CONTEXT),
158-
new ExecutionContextRowMapper(), executionId);
159-
if (!results.isEmpty()) {
160-
return results.get(0);
161-
}
162-
else {
163-
return new ExecutionContext();
164-
}
156+
return getJdbcClient().sql(getQuery(FIND_JOB_EXECUTION_CONTEXT))
157+
.param("jobExecutionId", executionId)
158+
.query(new ExecutionContextRowMapper())
159+
.optional()
160+
.orElseGet(ExecutionContext::new);
161+
165162
}
166163

167164
@Override
168165
public ExecutionContext getExecutionContext(StepExecution stepExecution) {
169166
Long executionId = stepExecution.getId();
170167
Assert.notNull(executionId, "ExecutionId must not be null.");
171168

172-
List<ExecutionContext> results = getJdbcTemplate().query(getQuery(FIND_STEP_EXECUTION_CONTEXT),
173-
new ExecutionContextRowMapper(), executionId);
174-
if (results.size() > 0) {
175-
return results.get(0);
176-
}
177-
else {
178-
return new ExecutionContext();
179-
}
169+
return getJdbcClient().sql(getQuery(FIND_STEP_EXECUTION_CONTEXT))
170+
.param("stepExecutionId", executionId)
171+
.query(new ExecutionContextRowMapper())
172+
.optional()
173+
.orElseGet(ExecutionContext::new);
180174
}
181175

182176
@Override
@@ -256,7 +250,9 @@ public void saveExecutionContexts(Collection<StepExecution> stepExecutions) {
256250
*/
257251
@Override
258252
public void deleteExecutionContext(JobExecution jobExecution) {
259-
getJdbcTemplate().update(getQuery(DELETE_JOB_EXECUTION_CONTEXT), jobExecution.getId());
253+
getJdbcClient().sql(getQuery(DELETE_JOB_EXECUTION_CONTEXT))
254+
.param("jobExecutionId", jobExecution.getId())
255+
.update();
260256
}
261257

262258
/**
@@ -265,7 +261,9 @@ public void deleteExecutionContext(JobExecution jobExecution) {
265261
*/
266262
@Override
267263
public void deleteExecutionContext(StepExecution stepExecution) {
268-
getJdbcTemplate().update(getQuery(DELETE_STEP_EXECUTION_CONTEXT), stepExecution.getId());
264+
getJdbcClient().sql(getQuery(DELETE_STEP_EXECUTION_CONTEXT))
265+
.param("stepExecutionId", stepExecution.getId())
266+
.update();
269267
}
270268

271269
@Override
@@ -294,16 +292,13 @@ private void persistSerializedContext(Long executionId, String serializedContext
294292
longContext = null;
295293
}
296294

297-
getJdbcTemplate().update(getQuery(sql), ps -> {
298-
ps.setString(1, shortContext);
299-
if (longContext != null) {
300-
ps.setString(2, longContext);
301-
}
302-
else {
303-
ps.setNull(2, getClobTypeToUse());
304-
}
305-
ps.setLong(3, executionId);
306-
});
295+
getJdbcClient().sql(getQuery(sql))
296+
// @formatter:off
297+
.param(1, shortContext)
298+
.param(2, longContext, getClobTypeToUse())
299+
.param(3, executionId)
300+
// @formatter:on
301+
.update();
307302
}
308303

309304
/**

0 commit comments

Comments
 (0)