分页基础知识:
公式:limit start,pageSize;
start: 当前页的起始索引,(偏移量)
pageSize: 每页多少条
currentPage: 当前页数
示例:
查询第一页数据的10条数据:Limit 0,10
查询第二页数据的10条数据:Limit 10,10
查询第三页数据的10条数据:Limit 20,10
查询第四页数据的10条数据:Limit 30,10
从上我们可以发现公式中第一个参数start一直在变化,start的计算公式如下:
start=(currentPage-1)*pageSize//(当前第几页-1)*每页显示多少条
现在我们需要的问题主要几个:
① 计算表记录总数:totalNum
② 根据自定义的pageSize(即每页要显示多少条)和totalNum(表记录总数)
来计算总页数:totalPage
③ 如何获取每一页的起始索引start?这里我们通过jsp页面的每一次点击来更新下一页起始索引。
pojo类:
public class Page {
private int start; //当前页的起始索引
private int pageSize; //每页显示多少条
private int totalNum; //表字段的总记录个数
//获取总页数:根据表字段中记录总数totalNum 和我们自定义的每页显示多条pageSize 进行计算
public int getTotalPageNum(int totalNum,int pageSize){
int totalPage = 0;
if(totalNum%pageSize!=0){
totalPage=(totalNum/pageSize)+1;
return totalPage;
}
totalPage=totalNum/pageSize;
return totalPage;
}
//判断是否有前一页
public boolean isHasPreivousPage(){
//如果当前位置等于0说明没有前一页
if(start>0){
return true;
}
return false;
}
//获取最后一页第一条数据的起始位置
public int getLastPageStartLoc(){
int loc = 0;
if(totalNum%pageSize==0){/*例如6%3等于0 那么第3页的起始位置是6-3=3 PS:索引从0开始算起*/
loc=totalNum-pageSize; /*表记录总条数-每页显示多少条*/
}else if(totalNum%pageSize!=0){/*例如7%3等于1 那么第4页的起始位置是7-(7%3)=7-1=6*/
loc=totalNum-totalNum%pageSize;
}
loc=loc>0?loc:0;/*三元表达式 如果loc<0说明 表记录总条数<每页系那是多少条 所以最后一页就从0开始算计*/
return loc;
}
//判断是否有后一页
public boolean isHasNextPage(){
//如果当前页索引>=最后一页第一条的索引,说明没有后一页了。
if(start>=getLastPageStartLoc()) {
return false;
}
return true;
}
//以及 属性的set、get。toString方法 这里不列举
}
orderMapper映射文件:
<!--这里我的实体类属性名和对应数据库字段名不一致所以起了别名-->
<!--统计表记录总条数-->
<select id="getTotalNum" resultType="Integer">
select count(*)
from tb_order;
</select>
<!--数据库实现分页查询-->
<select id="selectOrderByPage" resultType="Order" parameterType="Page">
select order_id as orderId,
d_id as dId,
order_no as orderNo,
order_Type as orderType,
cashier,
create_time as createTime,
end_time as endTime,
payment_type as paymentType,
price, created, updated
from tb_order
order by order_id ASC
<if test="start!=null and pageSize!=null">
limit #{start},#{pageSize}
</if>
</select>
orderMapper接口:
int getTotalNum(); //统计表记录总条数
List<Order>selectOrderByPage(Page page);//实现分页查询
orderServcie接口:
int getTotalNum(); //统计表记录总条数
List<Order>selectOrderByPage(Page page);//实现分页查询
orderServcieImpl业务层实现类:
@Autowired
OrderMapper orderMapper;
//统计表记录总数
@Override
public int getTotalNum() {
int totalNum = orderMapper.getTotalNum();
return totalNum;
}
//实现分页查询
@Override
public List<Order> selectOrderByPage(Page page) {
List<Order> orderListPage = orderMapper.selectOrderByPage(page);
return orderListPage;
}
orderController控制层:
@Autowired
private OrderService orderService;
@Autowired
private DoorService doorService;
//分页要用的变量
private Integer totalNum;//存储 表记录总数
private Integer pageSize =2;//自定义 每页显示两条
private Integer totalPage;//存储 总共需要多少页
private Integer start=0;//偏移量:当前页的起始索引
private Integer lastLoc;//存储最后一页起始索引
private Page page=new Page();
//通过分页查询所有
@RequestMapping("/findAllOrderByPage")
public String AllorderListByPage(Model model,@RequestParam(name="starts",defaultValue="0") Integer starts){
totalNum = orderService.getTotalNum();//获取表记录总条数
page.setTotalNum(totalNum);
page.setPageSize(pageSize);
page.setStart(starts);
lastLoc=page.getLastPageStartLoc();//获取最后一页位置
totalPage=page.getTotalPageNum(totalNum,pageSize);//获取总页数
List<Order> list = orderService.selectOrderByPage(page);//分页统计后的列表
model.addAttribute("page",page);
model.addAttribute("lastLoc",lastLoc);
model.addAttribute("totalPage",totalPage);
model.addAttribute("orderList",list);
return"orderList";
}
orderList.jsp页面:
(头文件标签)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@page isELIgnored="false"%>
显示所有列表部分:</font<
<div>
<a>新增</a>
<table border="1" cellspacing="0">
<%--表头--%>
<tr align="center" style="font-weight: bold;">
<td>序号</td>
<td>订单id</td>
<td>门店id</td>
<td>订单号</td>
<td>订单类型</td>
<td>收钱员</td>
<td>开单时间</td>
<td>结账时间</td>
<td>支付方式</td>
<td>支付金额</td>
<td>创建时间</td>
<td>修改时间</td>
</tr>
<c:forEach items="${orderList}" var="order" varStatus="i">
<tr>
<td align="center">${i.index+1}</td><%--index是固定的 类似于i++ --%>
<td>${order.orderId}</td>
<td>${order.dId}</td>
<td>${order.orderNo}</td>
<td>${order.orderType}</td>
<td>${order.cashier}</td>
<td><fmt:formatDate value="${order.createTime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td><fmt:formatDate value="${order.endTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
<td>${order.paymentType}</td>
<td>${order.price}</td>
<td><fmt:formatDate value="${order.created}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td><fmt:formatDate value="${order.updated}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td>
<a>删除</a>|
<a >修改</a>
</td>
</tr>
</c:forEach>
</table>
</div>
实现分页查询部分:
<hr/>
<c:choose><%--首页--%>
<c:when test="${page.start!=0}">
<span> <a href="/findAllOrderByPage?starts=0"/>首页</a> </span>
</c:when>
<c:otherwise>
<span>首页</span>
</c:otherwise>
</c:choose>
|
<c:choose><%--上一页--%>
<c:when test="${page.isHasPreivousPage()==true}">
<span> <a href="/findAllOrderByPage?starts=${page.start-page.pageSize}"/>上一页</a> </span>
</c:when>
<c:otherwise>
<span>上一页</span>
</c:otherwise>
</c:choose>
|
<c:choose><%--下一页--%>
<c:when test="${page.isHasNextPage()==true}">
<span> <a href="/findAllOrderByPage?starts=${page.start+page.pageSize}"/>下一页</a> </span>
</c:when>
<c:otherwise>
<span>下一页</span>
</c:otherwise>
</c:choose>
|
<c:choose><%--尾页--%>
<c:when test="${page.start!=page.getLastPageStartLoc()}">
<span> <a href="/findAllOrderByPage?starts=${lastLoc}"/>尾页</a> </span>
</c:when>
<c:otherwise>
<span>尾页</span>
</c:otherwise>
</c:choose>
|
总页数:<span>${totalPage}</span></p>
参考文章:https://www.jianshu.com/p/d108d0cd9acf