我正在尝试在spring batch中将参数传递给我的查询。我决定创建一个tasklet并使用JdbcTemplate,如下所示......
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext)
throws EpsilonBatchBusinessException {
LOGGER.debug("Enter execute.");
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.query(queryString,
new PreparedStatementSetter() {
public void setValues(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setInt(1, runNumber);
}
},
rowMapper);
LOGGER.debug("Exit execute.");
return RepeatStatus.FINISHED;
}
所以我给这个bean注入了一个dataSource,queryString,rowMapper对象和参数(runNumber)..这个tasklet将在一个步骤中被调用来创建一个列表。我通常将行映射器传递给JdbcCursorItemReader spring bean,并且不会编写tasklet,但是我的查询字符串需要一个参数,因此我正在编写这个tasklet。我不确定这个tasklet是否会像JdbcCursorItemReader那样做?您的意见将不胜感激
答案 0 :(得分:2)
更好的选择是使用JdbcCursorItemReader
并撰写自定义PreparedStatementSetter。
PreparedStatementSetter
界面非常简单;几乎所有你需要编写的代码都在下面。编写setter后,您需要做的就是将其配置为一个新的bean,并在config中注入runNumber
值,然后将该bean注入JdbcCursorItemReader
。这允许您使用所有常用的ItemReader
和ItemWriter
,而不必在Tasklet
中手动实现所有内容。
package com.foo;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.springframework.jdbc.core.PreparedStatementSetter;
public class YourParamSetter implements PreparedStatementSetter {
private int runNumber;
public void setValues(PreparedStatement ps) throws SQLException {
ps.setInt(1, runNumber);
}
public void setRunNumber(int runNumber) {
this.runNumber = runNumber;
}
public int getRunNumber() {
return runNumber;
}
}