[轉]Spring JdbcTemplate 查詢分頁


原文:http://blog.csdn.net/xiaofanku/article/details/4280128 

現在進行的項目由於數據庫的遺留原因(設計的不堪入目)不能用hibernate.所以用的Spring JdbcTemplate,今天作派譴員工的分頁,發現一個不錯的JdbcTemplate分頁寫法,較現在搜索到的寫法都值得說一說!看源碼吧!很簡單

1.大家都有的page類

public class CurrentPage<E> {
    private int pageNumber;
    private int pagesAvailable;
    private List<E> pageItems = new ArrayList<E>();
    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }
    public void setPagesAvailable(int pagesAvailable) {
        this.pagesAvailable = pagesAvailable;
    }
    public void setPageItems(List<E> pageItems) {
        this.pageItems = pageItems;
    }
    public int getPageNumber() {
        return pageNumber;
    }
    public int getPagesAvailable() {
        return pagesAvailable;
    }
    public List<E> getPageItems() {
        return pageItems;
    }
}

  2.分頁的助手類

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
public class PaginationHelper<E> {
	public CurrentPage<E> fetchPage(final JdbcTemplate jt,
			final String sqlCountRows, final String sqlFetchRows,
			final Object args[], final int pageNo, final int pageSize,
			final ParameterizedRowMapper<E> rowMapper) {
		// determine how many rows are available
		final int rowCount = jt.queryForInt(sqlCountRows, args);
		// calculate the number of pages
		int pageCount = rowCount / pageSize;
		if (rowCount > pageSize * pageCount) {
			pageCount++;
		}
		// create the page object
		final CurrentPage<E> page = new CurrentPage<E>();
		page.setPageNumber(pageNo);
		page.setPagesAvailable(pageCount);
		// fetch a single page of results
		final int startRow = (pageNo - 1) * pageSize;
		jt.query(sqlFetchRows, args, new ResultSetExtractor() {
			public Object extractData(ResultSet rs) throws SQLException,
					DataAccessException {
				final List pageItems = page.getPageItems();
				int currentRow = 0;
				while (rs.next() && currentRow < startRow + pageSize) {
					if (currentRow >= startRow) {
						pageItems.add(rowMapper.mapRow(rs, currentRow));
					}
					currentRow++;
				}
				return page;
			}
		});
		return page;
	}
}

  

完了!下面看一看Dao的一個接口:

List<Client> getAllCompanyTest(int pageSize)throws DataAccessException;

接口的實現:

	@Override
	public List<Client> getAllCompanyTest(int pageSize) throws DataAccessException {
		PaginationHelper<Client> ph = new PaginationHelper<Client>();
		List<Client> c=new ArrayList<Client>();
        CurrentPage<Client> p=ph.fetchPage(
                jdbcTemplate,  
                "SELECT count(*) FROM angle_company WHERE state=?",
                "SELECT acid,corpname,contact,legal,tel,postcode,mail,address,summary,employee_eeid FROM angle_company WHERE state=?",
                new Object[]{JdbcSqlCollection.NORMALRECORD},                
                pageSize,
                JdbcSqlCollection.PAGERECORDS,
                new TestClientRowMap()
        );		
        c=p.getPageItems();
		return c;
	}

  

最后還有一個ParameterizedRowMapper的實現類,就不貼原碼了,下面是簡單的偽代碼

class TestClientRowMap implements ParameterizedRowMapper<Client>{

    @Override
    public Client mapRow(ResultSet rs, int arg1) throws SQLException {
        Client client=new Client();

        ...

         return client;

}

 

引用原地址:

http://www.codefutures.com/tutorials/spring-pagination/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM