如何解决使用选择查询从数据库读取批处理 Tasklet
如何创建一个 tasklet 类来从 DB 进行自定义选择查询并将数据传递给下一个 tasklet?我必须使用 tasklet(没有 jdbcReader 或任何阅读器)
代码示例:
public class taskletreader implements tasklet,StepExecutionListener{
private final Logger logger = LoggerFactory.getLogger(taskletreader.class);
@Autowired
private DataSource dataSource;
private List<FichierEclate> FichierEclates;
private String query="select * from FicherEclate where .......some conditions...."
@Override
public void beforeStep(StepExecution stepExecution) {
FichierEclates = new ArrayList<FichierEclate>();
logger.debug("Reader initialized.");
}
@Override
public RepeatStatus execute(StepContribution contribution,ChunkContext chunkContext) throws Exception {
new JdbcTemplate(dataSource)
.execute(query);
return RepeatStatus.FINISHED;
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
// fu.closeReader();
stepExecution
.getJobExecution()
.getExecutionContext()
.put("FichierEclates",this.FichierEclates);
logger.debug("Reader ended.");
return ExitStatus.COMPLETED;
}
}
无法理解select的结果在哪里以及如何将其传递给下一个tasklet进行处理?
解决方法
无法理解select的结果在哪里
如果要使用查询的结果,可以在query
上使用JdbcTemplate
方法:
List<FichierEclate> fichierEclates = jdbcTemplate.query(query,new BeanPropertyRowMapper<>(FichierEclate.class));
此方法接受一个 RowMapper
,它将数据库中的每一行映射到域对象的一个实例。该示例使用 BeanPropertyRowMapper
,但您可以根据需要提供自定义映射器。
如何传递给下一个tasklet进行处理?
您可以像以前那样使用执行上下文。但是,您不应传递整个项目列表。执行上下文是持久化的,不建议在这样的步骤之间传递大量数据。项目 ID 列表可能没问题,但整个项目对象的列表不是一个好主意。有关详细信息,请参阅参考文档的 Passing Data to Future Steps 部分。
也就是说,我真的建议为此使用面向块的 tasklet。我知道你说的是 I have to use tasklet (no jdbcReader or any reader)
,但我不明白这个限制。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。