PageHelper分页的学习(一)
PageHelper分页的学习(一)
在编写项目中,时常需要对来自后台返回的数据进行表格显示,当数据很多时,就需要进行分页,因为你总不能让用户一直往下滑动,这样很恶心。需要实现的就像是这样的操作界面。

(图片来自:layuimini的数据表格),就像是上面的样子,可以实现很好的数据交互。
那如何搞这个事情呢?
首先,构建项目,这里我就很简单的项目就是为了学习这个分页所构建的简单的ssm的Maven项目(当然了,现在的前端框架也有实现分页,就像上面,不需要你写,但是你不写学习自己搞一个吗,也不要总是用别人的框架,是在不行用插件也可以)
1、在pom.xml文件中添加分页插件
<!-- 添加分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency>
2、创建数据库,创建数据表,添加数据
CREATE TABLE `students` ( `studentID` int NOT NULL, `studentName` varchar(11) DEFAULT NULL, `studentSex` varchar(11) DEFAULT NULL, `studentPhone` varchar(11) DEFAULT NULL, `studentAddress` varchar(11) DEFAULT NULL, `studentProfession` varchar(11) DEFAULT NULL, `studentGrade` varchar(11) DEFAULT NULL, PRIMARY KEY (`studentID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
插入了23条数据
insert into students values(1,'张三1','男','188888888','陕西省','软件工程','大三'); insert into students values(2,'张三2','男','188888888','陕西省','软件工程','大三'); insert into students values(3,'张三3','男','188888888','陕西省','软件工程','大三'); ......
3、创建实体类
import lombok.Data; @Data public class Students { private Integer studentID; private String studentName; private String studentSex; private String studentPhone; private String studentAddress; private String studentProfession; private String studentGrade; }
4、构建ssm框架(这里不做说明了)
但是在这里需要说明一个情况:就是我在添加了PageHelper的分页插件后,需要在SqlSessionFactoryBean中设置分页插件。
<!-- 配置数据工厂sqlsessionfactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 配置分页插件--> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties" value="reasonable=false"></property> </bean> </array> </property> </bean>
这里有一个参数需要注意,就是reasonable参数,默认是false,这个参数的作用是分页的合理化参数。啥意思?就是当你需要查询的页数,在[开始页数,结束页数]之间,就正常显示,若是出现你需要查询的页数下雨开始页数或大于结束页数的话,就会分别显示第一页与最后一页。
举例:就像我上面的信息数据表,我实质上最多显示5页,第五页是3条数据,但是我要是设置了true的话,即使我传入页数是7也会给我显示最后一页,也就是时刻会保持页面上有数据;但是若是设置为false,那就智慧按照你传入的页数显示,这个时候,页数为7就没有数据,页面就没有数据。
5、mapper
import java.util.List; public interface StudentsMapper { /** * 查询所有的学生信息 */ List<Students> getAllStudent(); }
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hui.mapper.StudentsMapper" >
<select id="getAllStudent" resultType="com.hui.pojo.Students">
select * from splitpage.students
</select>
</mapper>
(注意: 在这里如果使用分页插件的话,后话是会自动添加LIMIT关键字的,所以不能最后填上分号;得要吧分号去掉)
6、service
import java.util.List; public interface StudentsService { /** * 查询所有的学生 */ List<Students> getAllStudentService(); /** * 根据分页查询数据 */ PageInfo getStudentBySplitService(int splitPage, int pageSize); }
/** * 通过分页查询数据 * @return */ public PageInfo getStudentBySplitService(int splitPage,int pageSize) { PageHelper.startPage(splitPage,pageSize); List<Students> allStudent = studentsMapper.getAllStudent(); PageInfo<Students> pageInfo = new PageInfo<Students>(allStudent); return pageInfo; }
在业务层,进行对页的起始页数,与页的显示的条数进行操作,使用PageHelper进行分页设置(底层就是在SQL语句中添加了LIMIT关键字),然后从数据库中查找所有的相关信息,然后使用PageInfo进行对返回的list集合的对象进行封装成PageInfo对象,以便对其中的众多信息进行获取。
7、controller
/** * 分页显示,显示第一页的5条数据 */ @RequestMapping("/splitpage/{startPage}") public String getStudentBySplitPage(HttpServletRequest request,@PathVariable int startPage) { PageInfo pageInfo = studentsService.getStudentBySplitService(startPage, PAGE_SIZE); request.setAttribute("pageInfo",pageInfo); return "splitPage"; }
在controller层将PageInfo的对象添加到前台中
8、jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<html>
<head>
<title>分页测试</title>
</head>
<body>
<table style="width: 70%;margin: 30px auto;">
<tr style="border-bottom: 1px solid black">
<th>学号</th>
<th>姓名</th>
<th>性别</th>
<th>手机号</th>
<th>地址</th>
<th>专业</th>
<th>年级</th>
</tr>
<br>
<c:forEach items="${requestScope.pageInfo.list}" var="info">
获取其中的集合对象,需要在pageInfo对象下使用list得到集合对象
<tr style="border-bottom: 1px solid black">
<th>${info.studentID}</th>
<th>${info.studentName}</th>
<th>${info.studentSex}</th>
<th>${info.studentPhone}</th>
<th>${info.studentAddress}</th>
<th>${info.studentProfession}</th>
<th>${info.studentGrade}</th>
</tr>
</c:forEach>
</table>
</body>
</html>
做到现在的实现结果就只是将数据进行分页显示,但是还没有实现动态的互动,也就是说,每一页的大小是固定的,显示第几页也是我用参数传递进去的,那显然这样是不行的啊。参数的改变也是通过地址栏中的数字进行改变的。
结果:

我后续的操作还需要添加分页的按钮,点击不同的按钮实现分页,这个我得下一篇文章会说清楚。

浙公网安备 33010602011771号