07年末我們開發小組一直在研究:如何基於spring實現sybase的分頁查詢。經歷磨難後,由我師傅提出了一種奏效的解決方案:擴展spring的jdbcTemplate實現分頁查詢。這裏記錄下來,以備後用。
1.JdbcTemplateExtend.java
public class JdbcTemplateExtend extends JdbcTemplate
{
private DataSource dataSource;
/**
* 默認構造器,調用此方法初始化,需要調用setDataSource設置數據源
*/
public JdbcTemplateExtend()
{
}
/**
* 初始構造器
*
* @param dataSource
* 數據源
*/
public JdbcTemplateExtend(DataSource dataSource)
{
this.dataSource = dataSource;
super.setDataSource(dataSource);
}
/**
* 普通分頁查詢<br>
* <b>如果結果結合比較大應該調用setFetchsize() 和setMaxRow兩個方法來控制一下,否則會內存溢出</b>
* @see #setFetchSize(int)
* @see #setMaxRows(int)
* @param sql
* 查詢的sql語句
* @param startRow
* 起始行
* @param rowsCount
* 獲取的行數
* @return
* @throws DataAccessException
*/
@SuppressWarnings("unchecked")
public List<Map> querySP(String sql, int startRow, int rowsCount)
throws DataAccessException
{
return querySP(sql, startRow, rowsCount, getColumnMapRowMapper());
}
/**
* 自定義行包裝器查詢<br>
* <b>如果結果結合比較大應該調用setFetchsize() 和setMaxRow兩個方法來控制一下,否則會內存溢出</b>
* @see #setFetchSize(int)
* @see #setMaxRows(int)
* @param sql
* 查詢的sql語句
* @param startRow
* 起始行
* @param rowsCount
* 獲取的行數
* @param rowMapper
* 行包裝器
* @return
* @throws DataAccessException
*/
@SuppressWarnings("unchecked")
public List<Map> querySP(String sql, int startRow, int rowsCount, RowMapper rowMapper)
throws DataAccessException
{
return (List) query(sql, new SplitPageResultSetExtractor(rowMapper, startRow,
rowsCount));
}
public DataSource getDataSource()
{
return dataSource;
}
public void setDataSource(DataSource dataSource)
{
this.dataSource = dataSource;
super.setDataSource(dataSource);
}
}
2.SplitPageResultSetExtractor.java
public class SplitPageResultSetExtractor implements ResultSetExtractor
{
private final int start;// 起始行號
private final int len;// 結果集合的長度
private final RowMapper rowMapper;// 行包裝器
public SplitPageResultSetExtractor(RowMapper rowMapper, int start, int len)
{
Assert.notNull(rowMapper, "RowMapper is required");
this.rowMapper = rowMapper;
this.start = start;
this.len = len;
}
/**
* 處理結果集合,被接口自動調用,該類外邊不應該調用
*/
public Object extractData(ResultSet rs) throws SQLException, DataAccessException
{
List result = new ArrayList();
int rowNum = 0;
int end = start + len;
point: while (rs.next())
{
++rowNum;
if (rowNum < start)
{
continue point;
}
else
if (rowNum >= end)
{
break point;
}
else
{
result.add(this.rowMapper.mapRow(rs, rowNum));
}
}
return result;
}
}
擴展spring jdbcTemplate 實現分頁查詢
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Spring1.0 與 2.0 事務配置方式的對比
1. 對比 先看1.0的標準事務配置: Spring 2.0 的重頭戲之一就是AspectJ 式 AOP 配置。 但是一定要通過對比,才能看到2.
诀窍的心灵
2020-07-06 15:23:30
spring中使用proxool作數據源連接池的配置(轉)
iteye_13521
2018-08-31 07:02:27
Pro Spring2.5 Over view ---- Ioc DI
bryan0205
2018-08-30 17:23:54
Spring 幾種 autowire的區別
bryan0205
2018-08-30 17:23:50
QuartZ和Spring整合
ck_wizard
2018-08-29 03:21:11
Spring SimpleUrlHandlerMapping的使用
ck_wizard
2018-08-29 03:21:11
Spring TaskExecutor
ck_wizard
2018-08-29 03:21:08
Spring ApplicationEvent 和 AbstractApplicationEventMulticaster
ck_wizard
2018-08-29 03:21:07