ItemReader

Como vimos ali em cima, o ItemReader deve:

Ler usuários que tem empréstimos próximo do retorno (numero de dias para retornar - 1 dia)

O nome será do reader será: readUsersWithLoansCloseToReturnReaderConfig

Inicialmente, criaremos um método para a classe que irá receber como parâmetro o data source. Usaremos o banco de dados library. Este método, retornará um ItemReader do tipo UserBookLoan.

Quando gostaríamos de obter dados do banco de dados, existe uma classe que estende o ItemReader, ela se chama: JdbcCursorItemReaderBuilder. Passaremos dentro dele, o UserBookLoan.

Como o método ficará inicialmente:

@Bean
public ItemReader<UserBookLoan> readUsersWithLoansCloseToReturnReader(@Qualifier("appDS")DataSource dataSource) {
    return new JdbcCursorItemReaderBuilder<UserBookLoan>()
}

Dentro do JdbcCursor, começaremos toda a lógica, veja:

@Bean
public ItemReader<UserBookLoan> readUsersWithLoansCloseToReturnReader(@Qualifier("appDS")DataSource dataSource) {
    return new JdbcCursorItemReaderBuilder<UserBookLoan>()
            //mesmo nome do metodo
            .name("readUsersWithLoansCloseToReturnReader")
            //passamos dataSource
            .dataSource(dataSource)
            //query SQL
            .sql("SELECT user.id as user_id, " +
                    "user.name as user_name, " +
                    "user.email as user_email, " +
                    "book.id as book_id, " +
                    "book.name as book_name, " +
                    "loan.loan_date " +
                    "FROM tb_user_book_loan as loan " +
                    "INNER JOIN tb_user as user ON loan.user_id = user.id " +
                    "INNER JOIN tb_book as book ON loan.book_id = book.id " +
                    "WHERE DATE_ADD(loan_date, INTERVAL " + numDaysToNofityReturn + " DAY) = DATE(NOW());")
            .rowMapper(rowMapper())
            .build();
}

Atualizado