最近做的一个项目使用jdbc实现后端分页,下面对他进行简单介绍:
整个分页实现流程如下:
每个分页都有自己的Pagination
pagnation中通常有以下几项:
DEFAULT_PAGE_SIZE//默认每页数据量
getCurrentPageNo()//获取当前页面number
getPageSize()//获取页面大小
getTotalCount()//取总记录数
getTotalPageCount()//获取总页数
hasNextPage()//判断是否有下一页
hasPreviousPage()//判断是否有上一页
在项目中分页部分的类和接口之间的关系如下:
Pagenation不仅仅用于jdbc实现的分页系统。因此,针对jdbc实现的分页有自己的IJdbcPage接口。
系统最终使用的是JdbcPage。
AbstractPagenation中的参数为:
protected intpageSize =DEFAULT_PAGE_SIZE;//每页的记录数
protected int start; //当前页第一条数据在List中的位置,从0开始
protected inttotalCount; //总记录数
我们是如何将sql查询到的resultset填充到自己定义的datalist二维表中的呢?方式如下:
jdbcTemplate返回的是一个resultSet,通过
ResultSetExtractor<DataList> rse = new ResultSetExtractor<DataList>() {
public DataList extractData(ResultSet rs) throws SQLException, DataAccessException {
return new JdbcPageDataList(rs);
}
};
//jdbc查询产生的resultset会首先根据上面的extractData方法处理,产生一个JdbcPageDataList。
DataList dataList = jdbcTemplate.query(sqlLimit, obj, rse);
return new JdbcPage(startIndex, totalCount, pageSize, dataList);
产生一个符合datalist形式的结果。
JadcPageDataList的生成代码如下:
private void dealBody(ResultSet rs, int colCount) throws SQLException { int rowNum = 0; while (rs.next()) { if (rs.getRow() == 0) { break; } DSRow row = new DSRow(colCount); rowList.add(row); for (int col = 1; col <= colCount; col++) { Object obj = ColType.getResultSetValue(rs, col, getColType(col - 1)); addCell(rowNum, col - 1, (Comparable) obj); } rowNum++; } } private int dealHead(ResultSet rs) throws SQLException { ResultSetMetaData resultSetMetaData = rs.getMetaData(); int colCount = resultSetMetaData.getColumnCount(); headerList = new ArrayList<DBHeader>(colCount); for (int col = 1; col <= colCount; col++) { int colType = resultSetMetaData.getColumnType(col);//获取此列的数据类型 DBHeader header = new DBHeader(); ColType type = ColType.parseSqlType(colType); header.setColType(type); header.setColDBName(resultSetMetaData.getColumnLabel(col));//返回此列暗含的标签 headerList.add(header); } return colCount; }