jdbc实现分页,需要前端传当前页码
1.封装一个公共实体类用于返回:实体数据,当前页,总页数,总条数,每页多少条
public class PageInfo<T> { //一页显示的记录数 private int numPerPage=10; //记录总数 private int totalRows; //总页数 private int totalPages; //当前页码 private int currentPage; private List<T> list; // 总数统计 private T sumObj; public T getSumObj() { return sumObj; } public void setSumObj(T sumObj) { this.sumObj = sumObj; } public PageInfo() { this.totalRows = 0; this.totalPages = 0; this.currentPage = 1; } public PageInfo(Integer currentPage, int totalRows) { if(currentPage==null)currentPage=1; setCurrentPage(currentPage); this.totalRows = totalRows; } public PageInfo(Integer currentPage){ if(currentPage==null)currentPage=1; setCurrentPage(currentPage); } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage <= 0 ? 1 : currentPage; } public int getNumPerPage() { return numPerPage; } public void setNumPerPage(int numPerPage) { this.numPerPage = numPerPage; } public int getTotalPages() { if (this.totalPages == 0) { this.totalPages = this.totalRows / this.numPerPage + (this.totalRows % this.numPerPage == 0 ? 0 : 1); } return this.totalPages; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public int getTotalRows() { return totalRows; } public int getStartIndex() { return (currentPage - 1) * numPerPage; } public void setTotalRows(int totalRows) { this.totalRows = totalRows; } public void setList(List<T> list) { this.list = list; } public List<T> getList() { return list; } }
2.思路:
1)先计算总条数,每页条数可以固定,当前页数,总页数:
select count(*)from (自己写的查询语句) a;//计算出总条数,然后通过总条数和每页条数计算出总页数,当前页是前端传递过来的。将计算出来的这些数据放入PageInfo<T>的页数相关字段中
2)获取对应页数的T(实体类):
通过mysql的limit字段:
开始页数:
public int getStartIndex() {
return (currentPage - 1) * numPerPage;
}
条数:取每页条数。
3)将T封装到PageInfo<T>的private List<T> list中;
4)返回PageInfo<T>
3.具体方法:
public <T> PageInfo<T> getObjectsByPage(Class<T> cls,String sql,RowMapper<T> rowMapper,PageInfo<T> pageInfo,Object[] objects){ if(null==pageInfo){ pageInfo=new PageInfo<T>(); } if(pageInfo.getTotalRows()<=0){ //总条数 Integer total= this.getCount(sql, objects); pageInfo.setSumObj(sumObj); //Integer total=getObjectCount(cls,sql, objects); pageInfo.setTotalRows(total);//总条数:sum子查询出来的 //总页数 Integer totalPages= (int) Math.ceil((double)total/(double)pageInfo.getNumPerPage()); pageInfo.setTotalPages(totalPages); } List<T> list=getObjectList(cls,sql, objects, pageInfo, rowMapper); pageInfo.setList(list); return pageInfo; } private Integer getCount(String sql,Object... objects){ StringBuffer count=new StringBuffer("select "); String sqlStr=sql.toLowerCase(); count.append(" count(*) id "); count.append(" from ("); count.append(sqlStr); count.append(") temp_for_page_count"); return getAccess(null).findInteger(count.toString(), objects); } private <T> List<T> getObjectList(Class<T> cls,String sql,Object[] objects,PageInfo<T> pageInfo,RowMapper<T> rowMapper){ StringBuffer limit=new StringBuffer(sql); limit.append(" limit ").append(pageInfo.getStartIndex()).append(",").append(pageInfo.getNumPerPage()); List<T> list=getAccess(cls).find(limit.toString(),rowMapper,objects); return list; }
jdbc查询语句:
public <T> List<T> find(String sql, RowMapper<T> rowMapper, Object... params) { StopWatch watch = new StopWatch(); try { return this.jdbcTemplate.query(sql, params, rowMapper); } finally { this.logger.debug(FIND_SQL_LOG, new Object[] { sql, params, Long.valueOf(watch.elapsedTime()) }); if (watch.elapsedTime() > SLOW_SQL_TIME_LENGTH) this.logger.warn(SLOW_SQL_LOG, new Object[] { sql, Long.valueOf(watch.elapsedTime()) }); } }