分页
一个系统,由于数据量都会比较多,所以开发的时候都会做分页功能的
真分页(limit)与假分页(内存中)
真分页:匀速,用户体验还可以,用得多一点
假分页:每一次非常慢(后面就快),还会占内存
1 创建分页对象 PageList
把分页的所有数据封装给传给前端
哪些属性(当前页,每页条数,首页,尾页,上一下,下一页,总页数,总条数,当前页数据)
当前页,每页条数 -> 前台传过来
总条数,当前页数据 -> 数据库中查出来
上一页,下一页,总页数 -> 计算出来的
/**
* 分页对象
* @author Administrator
*
*/
public class PageList<T> {
//当前页 -> 前台传过来
private int currentPage = 1;
//每页条数 -> 前台传过来/自己定义
private int pageSize = 10;
//首页(第一页)
private int firstPage = 1;
//上一页 计算出来 currentPage>1?currentPage-1:1
private int prevPage;
//下一页 计算出来 currentPage<lastPage?currentPage+1:lastPage
private int nextPage;
//尾页 == 总页数
private int lastPage;
//总页数 计算出来 totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1
private int totalPage;
//总条数 -> 数据库中查询出来
private int totalCount;
//当前页的数据 -> 数据库中查询出来
private List<T> data = new ArrayList<>();
public PageList(){}
/**
* @param currentPage:前台传过来
* @param pageSize:前台传过来
* @param totalCount:数据库中查询
* @param data:数据库中查询
*/
public PageList(int currentPage, int pageSize, int totalCount, List<T> data) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.totalCount = totalCount;
this.data = data;
//计算上一页 当前页>1 ? 当前页-1 : 1
this.prevPage = this.currentPage>1 ? this.currentPage-1 : 1;
//计算总页数 总条数%每页条数==0? 总条数/每页条数:总条数/每页条数+1
this.totalPage = this.totalCount%this.pageSize==0?this.totalCount/this.pageSize:this.totalCount/this.pageSize+1;
this.lastPage = this.totalPage; //最后一页就是总页数
//计算下一页 当前页<总页数?当前页+1:总页数;
this.nextPage = this.currentPage<this.totalPage?this.currentPage+1:this.totalPage;
}
//getter,setter省略
}
2 创建SQL条件对象 SqlCondition
接收前台传过来的分页条件(currentPage,pageSize)
public class SqlCondition {
//当前页
private int currentPage = 1;
//每页条数
private int pageSize = 10;
//getter,setter省略
}
3 在dao中添加了相应的方法
根据条件查询到数据,封装成PageList对象 返回
/**
* 最后返回的是PageList对象,里面都要有值
* PageList(int currentPage, int pageSize, int totalCount, List<T> data)
*/
@Override
public PageList<Images> queryAll(SqlCondition condition) {
//①.拿到当前页与每页条数
int currentPage = condition.getCurrentPage();
int pageSize = condition.getPageSize();
//一.查询总条数
//1.1 准备查询总条数的sql
String sql = "select count(*) from t_image";
//1.2执行sql拿到总条数
Integer totalCount = jdbcTemplate.queryForObject(sql, Integer.class);
//二.查询当前页的数据
//2.1 计算当前页是从第几条数据开始的
int beginIndex = (currentPage-1) * pageSize;
//2.2 准备相应的SQL
String dataSql = "select * from t_image limit "+beginIndex+","+pageSize;
//2.3 执行查询功能
List<Images> data= jdbcTemplate.query(dataSql, new BeanPropertyRowMapper<>(Images.class));
//三.创建PageList对象并且返回
PageList pageList = new PageList(currentPage,pageSize,totalCount,data);
return pageList;
}
4 前端展示数据
controller中的修改
@RequestMapping("/query")
public String query(SqlCondition condition,Model model){
model.addAttribute("pageList",imageService.queryAll(condition));
return "main";
}
页面中的展示(循环的是pageList.data)
<c:forEach items="${pageList.data}" var="img">
...
</c:forEash>
分页条把值加上 -> ?currentPage=1
<!--分页-->
<nav class="navbar-right">
<ul class="pagination" id="paging">
<li>
<span>当前第${pageList.currentPage}页</span>
</li>
<li>
<a href="/images/query?currentPage=1">
<span aria-hidden="true">首页</span>
</a>
</li>
<li>
<a href="/images/query?currentPage=${pageList.prevPage}" aria-label="上一页">
<span aria-hidden="true">上一页</span>
</a>
</li>
<li>
</li>
<li>
<a href="/images/query?currentPage=${pageList.nextPage}" aria-label="下一页">
<span aria-hidden="true">下一页</span>
</a>
</li>
<li>
<a href="/images/query?currentPage=${pageList.lastPage}" aria-label="尾页">
<span aria-hidden="true">尾页</span>
</a>
</li>
<li>
<span>总页数:共${pageList.totalPage}页</span>
<span>总数据:共${pageList.totalCount}条</span>
</li>
</ul>
</nav>