Использование JdbcTemplate с именованными параметрами в весеннем пакете - PullRequest
1 голос
/ 02 марта 2012

Я пытаюсь передать параметр моему запросу в весеннем пакете. Я решил создать тасклет и использовать 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;
}

Итак, я добавляю этому бину объект dataSource, queryString, rowMapper и параметр (runNumber). Этот тасклет будет вызываться на шаге для создания списка. Я обычно передаю преобразователь строки в пружинный компонент JdbcCursorItemReader и не пишу тасклет, но моей строке запроса нужен параметр, поэтому я пишу этот тасклет. Я просто не уверен, что этот тасклет сделает то же самое, что и JdbcCursorItemReader? Ваш вклад будет оценен

1 Ответ

2 голосов
/ 05 марта 2012

Лучшим вариантом было бы использовать JdbcCursorItemReader и написать пользовательский PreparedStatementSetter .

Интерфейс PreparedStatementSetter очень прост;почти весь код, который вам нужно написать, приведен ниже.После того, как сеттер записан, все, что вам нужно сделать, это настроить его как новый бин со значением runNumber, введенным в конфигурацию, а затем внедрить этот бин в 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;
    }

}
...