package cn.org.rapid_framework.jdbc.support;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.util.Assert;
/**
* 用于分页查询的ResultSetExtractor,会移动游标(cursor)至offset,并根据limit参数抽取数据
*
* <br/>
* <b>使用</b>
* <pre>
* (List)getJdbcTemplate().query(sql, paramMap, new OffsetLimitResultSetExtractor(startRow,pageSize,rowMapper))
* </pre>
*
* @author badqiu
*
*/
public class OffsetLimitResultSetExtractor implements ResultSetExtractor {
private int limit;
private int offset;
private RowMapper rowMapper;
public OffsetLimitResultSetExtractor(int offset,int limit,RowMapper rowMapper) {
Assert.notNull(rowMapper,"'rowMapper' must be not null");
this.rowMapper = rowMapper;
this.offset = offset;
this.limit = limit;
}
public Object extractData(ResultSet rs) throws SQLException,DataAccessException {
List results = new ArrayList(limit > 50 ? 50 : limit);
if (offset > 0) {
// Skip Results
// if (rs.getType() == ResultSet.TYPE_FORWARD_ONLY) {
// for (int i = 0; i < offset; i++) {
// if (!rs.next()) {
// return new ArrayList(0);
// }
// }
// } else {
rs.absolute(offset);
// }
}
int rowNum = 0;
while (rs.next()) {
Object row = rowMapper.mapRow(rs, rowNum++);
results.add(row);
if((rowNum + 1) >= limit)
break;
}
return results;
}
}