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>

后端要懂一些前端的内容,这里的话就仅供参考,这是前端的事情了。

这样就实现了简单的分页查询,给大家展示一下最终效果:

SpringMVC分页查询和显示

我这里数据库里面就添加了几条数据,如果数据量很大的话,这个分页的效果就很明显了。

最后如果再加上增删改查,这个页面就比较完美了,最终效果如下:

SpringMVC分页查询和显示

这样的话,就是一个比较完美的页面操作数据库了

需要源码的话可以找我~

相关推荐