问题描述:
使用MyBatisPagingItemReader作为SpringBatch的Reader,发现只能读取数据库查询结果第一页的数据。
解决过程:
当前的SQL:
select * from user where mod(userId,2)=0
查看MyBatisPagingItemReader的源码,其中有一个方法引起了我的注意。
protected void doReadPage() {
Map<String, Object> parameters = new HashMap<String, Object>();
if (parameterValues != null) {
parameters.putAll(parameterValues);
}
parameters.put("_page", getPage());
parameters.put("_pagesize", getPageSize());
parameters.put("_skiprows", getPage() * getPageSize());
if (results == null) {
results = new CopyOnWriteArrayList<T>();
} else {
results.clear();
}
results.addAll(sqlSessionTemplate.<T> selectList(queryId, parameters));
}
对于每一个SQL,MyBatisPagingItemReader都会传入三个参数:
_page 当前页
_pagesize 页面大小
_skiprows 跳过行
因此我们的SQL构造必须要满足能够传入参数。
于是改为:
select * from user where mod(userId,2)=0 limit #{_pagesize} OFFSET #{_skiprows}