/* * @(#)PartResultSetExtractor.java 1.0.0 Jul 8, 2011 8:32:53 AM * * Copyright 2011 YaoChen, Ltd. All rights reserved. * YaoChen PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package com.ycsoft.daos.core; 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.BeanPropertyRowMapper; import org.springframework.jdbc.core.ResultSetExtractor; import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper; /** * <p>从游标读取数据时,按照给定的条数读取,读取到给定的条数时, * 则调用处理器,直到所有的结果集读取完毕。</p> * * @see org.springframework.jdbc.core.ResultSetExtractor * @author allex */ public class PartResultSetExtractor<T> implements ResultSetExtractor<Object>{ //默认从结果集中获取的记录条数 public static final int DEFAULT_LIMIT = 1000; //default ResultSet's fetchSize public static final int DEFAULT_FETCH_SIZE = DEFAULT_LIMIT; private DataHandler<T> dataHandler; private int limit = PartResultSetExtractor.DEFAULT_LIMIT; private BeanPropertyRowMapper<T> rowMapper; //当前的fetch次数 private int fetchCount = 0; public PartResultSetExtractor(Class<T> cls, DataHandler<T> dataHandler) { rowMapper = ParameterizedBeanPropertyRowMapper.newInstance(cls); this.dataHandler = dataHandler; } public PartResultSetExtractor(Class<T> cls, DataHandler<T> dataHandler, int limit) { this(cls, dataHandler); this.limit = limit; } public Object extractData(ResultSet rs) throws SQLException, DataAccessException { boolean cursorEnd = false; try { while (rs.next()) { final int rowNum = fetchCount * limit; List<T> rows = new ArrayList<T>( limit ); rows.add(rowMapper.mapRow(rs, rowNum)); for (int i = 1; i < limit; i++) { if (rs.next()) { rows.add(rowMapper.mapRow(rs, rowNum + i)); } else { cursorEnd = true; break; } } fetchCount++; // data handler dataHandler.fetchRows(rows, fetchCount); // clear data //rows.clear(); // check cursor if (cursorEnd) { break; } } } catch (Exception ex) { ex.printStackTrace(); } return null; } }