如何从数据库中检索/设置ItemReader的SQL查询?

时间:2019-04-19 19:07:37

标签: spring-batch

我有一个Spring Batch程序,该程序从DB读取数据并进行处理,然后(使用ItemWriter)插入数据库的其他表中。在这里,我对ItemReader,ItemProcessor和ItemWriter使用了一堆SQL查询。

我的要求是将所有这些查询存储在具有参数和值格式的表中,并通过单个DB调用对其进行检索,并将其传递给ItemReader或ItemProcessor或ItemrWriter。因此,如果将来查询中有任何更改,我们最终将只进行数据库更新,而代码将保持不变。

我尝试在beforeJob部分中进行操作,但是我遇到错误,提示“ java.lang.IllegalArgumentException:必须提供SQL查询”。但是我可以通过在ItemReader方法内进行数据库调用来成功完成此操作。我试图避免这种方法,因为我需要为每个ItemReader,ItemProcessor和ItemWriter进行数据库调用。请让我知道如何实现此目标?

2 个答案:

答案 0 :(得分:1)

您可以创建一个带有Tasklet的步骤,该Tasklet从数据库中读取查询并将其添加到某个键下的执行上下文中,然后使用来自执行上下文的查询来配置面向块的步骤的读取器。这是一个简单的示例:

1。检索查询并将其放在执行上下文中:

@Bean
public Tasklet queryRetrievalTasklet() {
    return (contribution, chunkContext) -> {
        String query = ""; // retrieve query from db (using a JdbcTemplate for example)
        chunkContext.getStepContext().getJobExecutionContext().put("query", query);
        return RepeatStatus.FINISHED;
    };
}

2。从执行上下文中为查询配置阅读器

@Bean
@StepScope
public ItemReader<Integer> itemReader(@Value("#{jobExecutionContext['query']}") String query) {
    // return your reader configured with the query
    return null;
}

希望这会有所帮助。

答案 1 :(得分:0)

我认为,这种配置通常是通过将查询存储在属性而不是数据库中来完成的。喜欢:

<div class="card text-center">
    Full name is: {{ fullname }}
</div>