Мне нужно обновить SQL-запрос, используя аргументы командной строки.
Я создаю Spring Batch, где он будет читать SQL-запрос, а Spring Batch будет читать запрос и обновит данные в файл JSON.
SQL-запрос в batch.xml:
<resultMap id="fndEmpSeniorityRsltMap" >
<id column="EmpId" property="empID" />
<result column="EmpName" property="empName" />
</resultMap>
<select id="fndEmp" parameterType="java.lang.String" resultMap="fndEmpRsltMap">
select EmpId, EmpName from Emp
</select>
Аргументы строки cmd:
private Set<String> argumentValue;
--cmdLineArgument=<name>
itemreadwirtejob
@Bean
public ItemReader<Emp> btchItmRdr(SqlSessionFactory sqlSessionFactory) {
final MyBatisCursorItemReader<Emp> reader = new MyBatisCursorItemReader<>();
reader.setSqlSessionFactory(sqlSessionFactory);
reader.setParameterValues(cnfgRdr.getParamMap());
reader.setQueryId("fndEmp");
return reader;
}
@Bean
public ItemWriter<Emp> itmWrtrInCsv() throws DataAcesExcp {
try {
final FlatFileItemWriter<Emp> csvWriter = new FlatFileItemWriter<>();
csvWriter.setShouldDeleteIfExists(true);
csvWriter.setResource(new FileSystemResource(cnfgRdr.getOutLocCsv()));
csvWriter.setHeaderCallback(headerWriter -> headerWriter.append("EmpId").append(",")
.append("EMPName").append(",");
csvWriter.setLineAggregator(item -> new StringBuilder().append(item.getEmpID())
.append(",").append(item.getEmpName()).append(",")toString());
return csvWriter;
} catch (DataAccessException excp) {
throw new DataAcesExcp(excp);
}
}
@Bean
public ItemWriter<Emp> itmRdrInJson() throws DataAcesExcp {
try {
final FlatFileItemWriter<Emp> jsonWriter = new FlatFileItemWriter<>();
jsonWriter.setShouldDeleteIfExists(true);
jsonWriter.setResource(new FileSystemResource(cnfgRdr.getOutLocTxt()));
jsonWriter.setLineAggregator(new JsonLineAggregator<Emp>());
jsonWriter.setFooterCallback(new JsonFlatFileFooterCallback());
return jsonWriter;
} catch (DataAccessException excp) {
throw new DataAcesExcp(excp);
}
}
@Bean
public Step rdItmAndWrtInCsv() throws DataAcesExcp {
return stepBuilderFactory.get("rdItmAndWrtInCsv").<Emp, Emp> chunk(cnfgRdr.getChunkSize())
.reader(btchItmRdr(sqlSessionFactory)).faultTolerant().retryLimit(cnfgRdr.getRetryLimit())
.retry(DeadlockLoserDataAccessException.class).writer(itmWrtrInCsv()).build();
}
@Bean
public Step rdItmAndWrtInJson() throws DataAcesExcp {
return stepBuilderFactory.get("rdItmAndWrtInJson").<Emp, Emp> chunk(cnfgRdr.getChunkSize())
.reader(btchItmRdr(sqlSessionFactory)).faultTolerant().retryLimit(cnfgRdr.getRetryLimit())
.retry(DeadlockLoserDataAccessException.class).writer(itmRdrInJson()).build();
}
@Bean
public Job rdItmAndWrtJob(BtchJobCmtnNotfLstnr lstnr,JobBuilderFactory jobBuilderFactory) throws DataAcesExcp {
if(argumentValue.get(0).equalsIgnoreCase("read"))
{
return jobBuilderFactory.get("rdItmAndWrtJob").incrementer(new RunIdIncrementer())
.listener(lstnr).start(rdItmAndWrtInCsv()).next(rdItmAndWrtInJson()).build();
}
}
В приведенном выше коде, если я передам чтение как аргументы командной строки, он прочитает запрос sql и обновит файл csv и josn данными.
Теперь мне нужно следующее:
Top- Top 500 записей по умолчанию,
Emp - для конкретного сотрудника.
Если я передам Top как cmd line arg, пакету Spring потребуется обновить запрос и показать первые 500 записей из таблицы.
То же самое для emp, если я передам empid = 500 в качестве аргумента строки cmd, запрос должен показать запись с empid = 500.
Пожалуйста, дайте мне знать, если есть какие-либо решения для этого. Заранее спасибо