Spring-batch-JdbcPagingItemReader/setSortKeys方法

本文只简单阐述一下JdbcPagingItemReader分页时候的使用方式,或者说注意事项,也就是setSortKeys的字段设置

本文将演示这样一个需求:
mysql数据库的表zzz中有很多数据,我将每次读取10条数据(分页),并打印到控制台,打完完毕,再读取10条,直到将表zzz中的内容读完

在代码演示之前,有两个关键点

  1. 使用spring-batch进行分页查询的时候,必须设置sortkeys(就是说执行sql的时候必须明确order by,而不能使用数据库默认排序)

  2. 表zzz中必须要存在某列是主键,或者某列是唯一索引,假设表中即不存在主键,也不存在唯一索引,这样会导致任意两行数据的任意两列数据重复,如果是这样,那么将无法使用spring-batch,例如下面的表就是错误的,因为这第1行和第3行cat列重复,所以我们不能使用cat列作为order by的列,而第1行和第2行的order_no列内容也重复,所以我们也无法使用order_no列作为order by的列,这就导致spring-batch没有办法order by,如果你使用下面两列进行order by,那么分页必定出现有些数据无法查询到的情况,这与分页查询sql语句有关
    在这里插入图片描述

下面开始代码演示,首先我们需要设计一个正确的表,这个表明我叫做work_user,如下,其中id是自增的,这就保证spring batch在order by的时候,可以order by id,因为id是唯一索引,所以符合spring batch的要求
在这里插入图片描述

首先定义一个orm的实体类,一个类的实例对应数据库中的一条数据

public class WorkUser {

    private String id;

    private String name;
	// 省略get/set
}

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Resource
    private DataSource dataSource;

    @Bean
    public ItemReader<WorkUser> itemReader() {
        System.out.println("init itemReader()");
        JdbcPagingItemReader<WorkUser> reader = new JdbcPagingItemReader<>();
        reader.setDataSource(dataSource);
        reader.setFetchSize(10); 
        reader.setPageSize(10); 
        reader.setRowMapper(new TestRowMapper()); //将结果集行映射到WorkUser对象

        MySqlPagingQueryProvider provider = new MySqlPagingQueryProvider();
        provider.setSelectClause("select *");
        provider.setFromClause("from work_user");
        Map<String, Order> sortKeys = new HashMap<>();
        sortKeys.put("id", Order.ASCENDING);// 本文重点,本文重点,本文重点,本文重点,本文重点
        provider.setSortKeys(sortKeys);
        reader.setQueryProvider(provider);
        return reader;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值