Spring batch 在spring批处理中使用带命名参数的JdbcTemplate

Spring batch 在spring批处理中使用带命名参数的JdbcTemplate,spring-batch,jdbctemplate,Spring Batch,Jdbctemplate,我试图在spring批处理中向查询传递一个参数。我决定创建一个tasklet并使用JdbcTemplate,如下所示 public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws EpsilonBatchBusinessException { LOGGER.debug("Enter execute."); JdbcTemplate

我试图在spring批处理中向查询传递一个参数。我决定创建一个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注入了一个数据源、queryString、rowMapper对象和参数(runNumber)。。将在创建列表的步骤中调用此tasklet。我通常将行映射器传递给JdbcCursorItemReader Springbean,不会编写tasklet,但我的查询字符串需要一个参数,因此我正在编写这个tasklet。我只是不确定这个tasklet是否会像JdbcCursorItemReader那样发挥作用?欢迎您的输入

一个更好的选择是使用
JdbcCursorItemReader
并编写一个自定义的

PreparedStatementSetter
界面非常简单;您需要编写的几乎所有代码都在下面。一旦编写了setter,您需要做的就是将其配置为一个新bean,并在配置中注入
runNumber
值,然后将该bean注入
JdbcCursorItemReader
。这允许您使用所有常用的
ItemReader
s和
itemrwriter
s,而不必在
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;
    }

}