JdbcPagingItemReader

https://shradha-yewale.github.io/Spring-batch-pagination-with-JdbcPagingItemReader/

It retrieves database records in a paging fashion.

In this post we will understand how to read the input data of batch job by using JdbcPagingItemReader. It significantly reduces the result set fetching time. Let’s have a look with following example to read student records from ‘STUDENTS’ table using pagination.

 public class Student {
   private String id;
   private String name;
 }

 public class StudentMapper implements RowMapper<Student>  {

    @Override
    public Student mapRow(final ResultSet rs, final int rowNum) {
       Student student = new Student (); 
       student.setId(rs.getString("id"));
       student.setName(rs.getString("name"));
       return student;
    }  
 }

 public class StudentDataReader {

    @Autowired
    private DataSource dataSource;

    private static final String GET_STUDENT_INFO = "SELECT * from STUDENTS where id = :id and name = :name ";
    
    public JdbcPagingItemReader<Student> getPaginationReader(Student student) {
        final JdbcPagingItemReader<Student> reader = new JdbcPagingItemReader<>();
        final StudentMapper studentMapper = new StudentMapper();
        reader.setDataSource(dataSource);
        reader.setFetchSize(100);
        reader.setPageSize(100);
        reader.setRowMapper(studentMapper);
        reader.setQueryProvider(createQuery());
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("id", student.getId());
        parameters.put("name", student.getName());
        reader.setParameterValues(parameters);
        return reader;
    }

    private PostgresPagingQueryProvider createQuery() {
        final Map<String, Order> sortKeys = new HashMap<>();
        sortKeys.put("id", Order.ASCENDING);
        final PostgresPagingQueryProvider queryProvider = new PostgresPagingQueryProvider();
        queryProvider.setSelectClause("*");
        queryProvider.setFromClause(getFromClause());
        queryProvider.setSortKeys(sortKeys);
        return queryProvider;
    }

    private String getFromClause() {
        return "( " + GET_STUDENT_INFO + ")" + " AS RESULT_TABLE ";
    }
}

Additional pages are requested when needed as read () method is called, returning an object corresponding to current position.

References: