SpringMVC分页查询和显示
现在是大数据时代了,我们数据库中存储的数据往往是成千上万条,这样就面临一个问题,当我们需要把数据库里面的东西呈现给客户的时候,不可能将所有商品列出来让用户去挨个找,而且一个页面上显示这么多数据,看上去都眼花缭乱,这样给客户带来的就是极差的用户体验。为了解决这个问题,需要把数据库里面的数据分页查询,显示给客户看,客户可以随便翻看某一页的数据。
本文主要讲解的是java后端如何把数据库的数据分页查询出来,然后在前台页面上显示给客户看。
在实现之前,先讲2个要使用的sql语句:
1、select column form table;
这个语句是用来查询数据库表里面的数据量的,根据查询到的数据量,我们才能确定需要多少页来显示。这里column需要建立索引,加快查询速度,table当然就是表名啦。
2、select * from table limit start,pageSize;
这句话就是分页查询的语句,limit后第一个参数start是int型,是起始查询位置(不包含),第二个参数是每页的数据条数,也是int型。举个例子,我要查询数据库里面第3条数据(包含)到第8条数据(包含)共6条,那么start=2,pageSize=8-2=6;
这里的话我直接使用spring和mybatis整合之后的service来进行查询,如果读者不会的话,可以选择自己会的数据库查询方法,写一个查询工具类来做service。
从dao层开始:
public interface UserDao {
@Select("select name from tb_test")
List<User> findUsers() throws Exception;
@Select("select * from tb_test limit #{start},#{perPageUsers}")
List<User> findUsersByPage(@Param("start") int start, @Param("perPageUsers") int perPageUsers) throws Exception;
}
这里我用了注解的方式写的sql语句,这样的话就不需要映射文件mapper.xml了;这里要注意,要使用@Param匹配一下参数,不然的话,2个参数无法进行匹配,简单的说就是,我现在给你2个参数填在2个空里面,你怎么知道哪个参数填在哪。
接着是service类:
public class UserDaoService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public List<User> findUsers() throws Exception {
List<User> list = userDao.findUsers();
return list;
}
public List<User> findUsersByPage(int start, int perPageUsers) throws Exception {
List<User> list = userDao.findUsersByPage(start, perPageUsers);
return list;
}
}
service的2个方法对应上面dao的2个sql语句,一个查询总数据,一个分页查询。
现在准备工作已经做好了,接下来咱们写一个页面类来存储页面信息:
public class Page {
private int currentPage=1; //当前页数
private int totalPages; //总页数
private int totalUsers; //记录总行数
private int pageSize=5; //每页记录行数
private int nextPage; //下一页
private int prefPage; //前一页
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getTotalPages() {
totalPages = totalUsers % pageSize == 0 ? totalUsers / pageSize : totalUsers / pageSize + 1;
return totalPages;
}
public int getTotalUsers() {
return totalUsers;
}
public void setTotalUsers(int totalUsers) {
this.totalUsers = totalUsers;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getNextPage() {
if (currentPage < totalPages) {
nextPage = currentPage + 1;
} else {
nextPage = currentPage;
}
return nextPage;
}
public int getPrefPage() {
if (currentPage > 1) {
prefPage = currentPage - 1;
} else {
prefPage = currentPage;
}
return prefPage;
}
}
这个类里面有6个属性,其中currentPage我们一般默认当前页为第一页,pageSize我们可以根据需求设置,这里我默认为5。那么,还有剩下的4个没有设置,第一个totalUsers,这个需要根据查询到的数据总量来确定,先不管;总页数totalPages的话,是根据totalUsers来确定的,因为我知道的总的数据,也知道了每页要显示的数据pageSize,那么可以得到下面一个算法
totalPages = totalUsers % pageSize == 0 ? totalUsers / pageSize : totalUsers / pageSize + 1;
能整除就刚好,不能整除就再加一页。
然后是上一页和下一页,这两个数据是根据当前页得到的,这里要做个判断,相信大家都懂,第一页的话没有上一页,最后一页的话没有下一页。所以,我们需要的就是set总数据量和当前页这两个工作,因为这两个一旦确定,其他的也就确定的。pagesize一般不会变,设置一次就行。
接下来就是控制器里的内容了:我们要查询第几页,是用户页面传递过来的 ,得到这个参数就可以进行查询了:
@Controller
@RequestMapping(value = "/user", method = RequestMethod.GET)
public class UserController {
@Autowired
UserDaoService userDaoService;
@Autowired
Page p;
@RequestMapping(value = "/page", method = RequestMethod.GET)
public String findUsersByPage(int page, Model model) {
try {
p.setTotalUsers(userDaoService.findUsers().size());
p.setCurrentPage(page);
List<User> list = userDaoService.findUsersByPage((page - 1) * p.getPageSize(), p.getPageSize());
// 查询结果是list集合
model.addAttribute("list", list);
model.addAttribute("page", p);
return "home";
} catch (Exception e) {
model.addAttribute("message", "未能获取数据");
return "message";
}
}
}
当我们拿到用户传递的参数的时候,第一步肯定是要把总的数据查出来,赋给page类,这样做的目的是因为,数据量可能会被增加和减少,总页数可能会有变化,所以每次请求都要赋值。其次,当前页别忘了赋值,如果用户告诉我查询第三页,我把第三页给用户之后,没给当前页赋值,那当前页还是1,用户点击下一页会是第二页,不是第四页。最后把查询结果和页面类传递给用户就可以了。
最后是jsp页面:
<%@page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt" %>
<html>
<head>
<title>Spring MVC表单处理</title>
</head>
<body>
<h2>您拥有以下这些咸鱼:</h2>
<table frame="box" rules="all">
<tr>
<td>序号</td>
<td>姓名</td>
<td>学号</td>
<td>创建时间</td>
<td>修改时间</td>
</tr>
<c:if test="${list!= null || fn:length(list) != 0}">
<c:forEach items="${list}" var="user" begin="0" end="${fn:length(list) }">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.number}</td>
<%--<td>${user.create_at}</td>--%>
<%--<td>${user.update_at}</td>--%>
<jsp:useBean id="create_at" class="java.util.Date"/>
<jsp:setProperty name="create_at" property="time" value="${user.create_at}"/>
<td><fmt:formatDate value="${create_at}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<jsp:useBean id="update_at" class="java.util.Date"/>
<jsp:setProperty name="update_at" property="time" value="${user.update_at}"/>
<td><fmt:formatDate value="${update_at}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
</tr>
</c:forEach>
</c:if>
</table>
<table>
<tr items="${page}">
<form method="GET" action="${pageContext.request.contextPath}/user/page">
<td><input type="hidden" name="page" value="1"></td>
<td><input type="submit" value="首页"></td>
</form>
<form method="GET" action="${pageContext.request.contextPath}/user/page">
<td><input type="hidden" name="page" value="${page.prefPage}"></td>
<td><input type="submit" value="上一页"></td>
</form>
<td>当前:第${page.currentPage}页<--></td>
<td>共:${page.totalPages}页</td>
<form method="GET" action="${pageContext.request.contextPath}/user/page">
<td><input type="hidden" name="page" value="${page.nextPage}"></td>
<td><input type="submit" value="下一页"></td>
</form>
<form method="GET" action="${pageContext.request.contextPath}/user/page">
<td><input type="hidden" name="page" value="${page.totalPages}"></td>
<td><input type="submit" value="尾页"></td>
</form>
</tr>
</table>
<form method="GET" action="${pageContext.request.contextPath}/user/page">
<table>
<tr>
<td>跳转到第:<input type="text" name="page" size="5"/>页</td>
<td><input type="submit" value="确定"></td>
</tr>
</table>
</form>
</body>
</html>
后端要懂一些前端的内容,这里的话就仅供参考,这是前端的事情了。
这样就实现了简单的分页查询,给大家展示一下最终效果:
我这里数据库里面就添加了几条数据,如果数据量很大的话,这个分页的效果就很明显了。
最后如果再加上增删改查,这个页面就比较完美了,最终效果如下:
这样的话,就是一个比较完美的页面操作数据库了
需要源码的话可以找我~