在Spring批处理中使用JdbcTemplate和Named参数

时间:2012-03-02 12:13:46

标签: spring-batch jdbctemplate

我正在尝试在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那样做?您的意见将不胜感激

1 个答案:

答案 0 :(得分:2)

更好的选择是使用JdbcCursorItemReader并撰写自定义PreparedStatementSetter

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

}