Spring batch - используйте JdbcCursorItemReader для чтения из источника данных и работы с ResultSet - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь использовать Spring Batch для создания задания, которое использует источник данных (настроить до) и запускает запрос. Я хочу иметь возможность перебирать возвращаемый ResultSet для создания новой таблицы с возвращенными данными.

Я могу создать такой читатель, но я не знаю, как повторить результаты.

@Bean
public JdbcCursorItemReader<ResultSet> reader(String query, DataSource dataSource) {
    JdbcCursorItemReader<ResultSet> itemReader = new JdbcCursorItemReader<>();
    itemReader.setDataSource(dataSource);
    itemReader.setSql(query);
    return itemReader;
}

Что должен получить мой ItemProcessor? Это

public class ExtractionItemProcessor implements ItemProcessor<ResultSet, String>{    
@Override
    public String process(ResultSet item) throws Exception {
        // transform the resultSet into a SQL INSERT
  }
}

РЕДАКТИРОВАТЬ: единственный способ узнать результаты запроса - это метаданные ResultSet, поэтому я не могу создать POJO и установить свойства.

1 Ответ

0 голосов
/ 28 июня 2018

Создать класс POJO для представления записи, например Foo:

public class Foo {
     private final long id;
     // more properties

     public Foo(long id // ,...) {
         this.id = id;
         // set other properties
     }

     public long getId() {
         return id;
     }
}

так читатель будет JdbcCursorItemReader<Foo>.

И создайте RowMapper<Foo>, например:

public FooRowMapper implements implements RowMapper<Foo> {

    @Override
    public Foo mapRow(ResultSet rs, int rowNum) throws SQLException {
        long id = rs.getLong("id");
        // more properties 
        return new Foo(id // more properties);
    }
}

и установите его на считывателе: itemReader.setRowMapper(new FooRowMapper()).

ExtractionItemProcessor получит Foo и будет выглядеть примерно так:

public class ExtractionItemProcessor implements ItemProcessor<Foo, String>{    
@Override
    public String process(Foo item) throws Exception {
    int someValue = transform(foo);
    return "INSERT INTO blah blah blah..." + someValue + "...";  // potentially dangerous - see SQL injection attack
  }
}

Чтобы продолжить, возможно, ExtractionItemProcessor преобразование Foo должно создать Bar. Тогда это будет выглядеть так:

public class ExtractionItemProcessor implements ItemProcessor<Foo, Bar>{    
@Override
    public Bar process(Foo item) throws Exception {
    int someValue = transform(foo);
    // more values....
       return new Bar(someValue // more values);
  }
}

Итак, импелентация ItemWriter займет List<Bar>, который знает, как безопасно вставить Bar s в другой стол.

...