我是春季批处理的新手。我正在执行一项任务,需要使用Spring Batch将数据从sql迁移到nosql。与SQL一样,它大约有1万条记录。我需要读取所有表,然后在临时DTO中写入,然后根据Mongo的建模,需要将其插入。
我的问题是:
ItemReader
中创建查询时需要照顾SQL关系吗?我想到了不需要按关系进行查询,最终可以将数据放入NOSql中。我编写了一个单独的查询,以从SQL读取所有表并将其放入TreeMap
中,并将每个键作为查询传递,并将RowMapper
作为值传递。喜欢,
我的计划是使用BeanPropertyRowMapper
而不是默认的Rowmapper
,然后一旦我读取SQL表,然后使用BeanPropertyRowMapper
直接写入临时DTO。读取所有表并设置到单独的临时DTO中
我想写一个通用的RowMapper
,它可以接受所有值,并使用BeanPropertyRowMapper
将其写入相应的临时DTO。
请帮助我如何实现这一目标。
谢谢!
public class QueryConstant {
public static final TreeMap<String, Object> queryDtoMap = new TreeMap<String, Object>();
static {
queryDtoMap.put("SQL_REGION", new RegionRowMapper());
queryDtoMap.put("SQL_COMPANY", new CompanyRowMapper());
}
public static final String SQL_REGION = "select reg.regn_cd, reg.regn_desc, reg.crte_user_id,reg.crte_ts, reg.lst_updt_user_id,reg.lst_updt_ts,reg. rplct_updt_ts\r\n"
+ "\r\n" + "from schm._regn reg";
public static final String SQL_COUNTRY = " select cntry.cntry_cd,cntry.cntry_nam,cntry.crte_ts,cntry.crte_user_id,cntry.lst_updt_user_id,cntry.rplct_updt_ts,\r\n"
+ "from schm.cntry cntry";
然后使用ItemReader如下读取它:
protected static final TreeMap<String, Object> collectionMap = new TreeMap<>();
@Bean("readerDataJob")
@Primary
public Job readDataJob() throws Exception {
return jobBuilderFactory.get("readDataJob")
.incrementer(new RunIdIncrementer())
.start(dataReaderJobStepOne())
.build();
}
@Bean
public Step dataReaderJobStepOne() throws Exception {
return (stepBuilderFactory.get("dataReaderJobStepOne")
.chunk(Integer.parseInt(chunkSize))
.reader(dataReader())
.writer(dataWritter())
.build());
}
@Bean
@StepScope
public JdbcCursorItemReader<?> dataReader() throws Exception {
JdbcCursorItemReader<?> reader = null;
if(!collectionMap.isEmpty()) {
collectionMap.clear();
}
for (String key : queryDtoMap.keySet()) {
reader = new JdbcCursorItemReader<>();
reader.setDataSource(this.dataSource);
reader.setSql(getQuery(key));
reader.setRowMapper((RowMapper) queryDtoMap.get(key));
reader.afterPropertiesSet();
collectionMap.put(key, reader);
}
System.out.println("collectionMap>>"+collectionMap);
return reader;
}
@Bean
public DataWritter dataWritter() {
return new DataWritter();
}
public class RegionRowMapper implements RowMapper<Object> {
@Override
public RegionDTO mapRow(ResultSet rs, int row) throws SQLException {
//GeneralDTO generalDTO = new GeneralDTO();
RegionDTO regionDTO = new RegionDTO();
//System.out.println("Result Set Print "+rs.toString());
regionDTO.setRegn_cd(rs.getString("regn_cd"));
regionDTO.setRegn_desc(rs.getString("regn_desc"));
regionDTO.setCrte_user_id(rs.getString("crte_user_id"));