spring+springmvc+mybatis+maven中使用PageHelper插件实现分页
目前小编在学习spring+springmvc+mybatis+maven整合开发,在开发后台的时候肯定会用到分页,度娘上面各种五花八门的,代码长串长串的,就没一个能实现的。今天刚填完坑,所以记录一下!
1、首先展示一下效果吧,此处我也写了模糊查询的,当然我没有写css样式,但是功能实现了。
模糊查询展示
2、代码部分(使用PageHelper插件实现分页)
(1)、在项目的pom.xml中添加2个jar包:pagehelper、jsqlparser
<!--
分页插件
https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper
-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
<!--
分页要用到此包
https://mvnrepository.com/artifact/com.github.jsqlparser/jsqlparser
-->
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>1.2</version>
</dependency>
(2)、在maybatis配置文件中添加一下代码(我的配置文件:spring-mybatis.xml)
<!-- 分页插件 -->
<property name="plugins">
<array>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<bean class="com.github.pagehelper.PageHelper">
<property name="properties">
<value>
dialect=mysql
</value>
</property>
</bean>
</array>
</property>
重点说一下:此段代码不能放错位置,否则你会发现,PageHelper.startPage(pageNum, pageSize);不管怎么都不能生效!
(3)、在xxxMapper.xml中写你的SQL语句:(我的是:AdminuserMapper.xml)
<!--
用户角色关联模糊查询(根据用户名)
id="getByLike":对应dao(持久层)中AdminuserMapper的getByLike()方法
property="role":对应model层中Adminuser的属性role
javaType="list":表示role返回的是list
-->
<resultMap type="bg.model.Adminuser" id="roleResultMap" extends="BaseResultMap">
<collection property="role" javaType="list" ofType="bg.model.Role">
<!-- 需要展示的字段 column="字段名" property="字段别名" -->
<id property="id" column="id" />
<result property="roleName" column="role_name" />
<result property="rule" column="rule" />
</collection>
</resultMap>
<select id="getByLike" resultMap="roleResultMap">
select * from adminuser join role on adminuser.role_id=role.id where 1=1 and username like '%${value}%'
</select>
(4)、在dao层,写方法,该方法要对应映射文件的id:我的是(AdminuserMapper.java)
/**
* 根据用户名模糊查询
* @param keywords
* @return
*/
public List<Adminuser> getByLike(String keywords);
(5)、在Service层
Service接口代码:(IAdminuserService.java)
public List<Adminuser> selectByLike(String keywords);
Service接口实现类中代码:(AdminuserServiceImpl.java)
@Override
public List<Adminuser> selectByLike(String keywords) {
return adminuserMapper.getByLike(keywords);
}
(6)、在Controller层
/**
* 用户 -角色关联查询、模糊搜索、分页
* @param page
* @param request
* @param model
* @param keywords
* @return
* 访问路径: http://localhost:8080/myblog/adminuserController/list.do
*/
@RequestMapping("/list")
public String list(@RequestParam(required= true, defaultValue="1") Integer page, HttpServletRequest request, Model model, String keywords){
//PageHelper.startPage(pageNum, pageSize);这段代码表示,程序开始分页了,pageNum默认值是1,pageSize默认是10,意思是从第1页开始,每页显示10条记录。
PageHelper.startPage(page, 10);
// 查询列表的结果
List<Adminuser> adminuserList = adminuserService.selectByLike(keywords);
// 得到分页的结果对象
PageInfo<Adminuser> p = new PageInfo<>(adminuserList);
model.addAttribute("page", p);
// 为前台记录输入查询的关键字
model.addAttribute("keywords", keywords);
return "list";
}
(7)、在测试类中,先测试一下,给出的结果是什么样的?
测试类中的代码如下:
@Test
public void test02(){
PageHelper.startPage(1, 10);
keywords = "";
List<Adminuser> adminuserList = adminuserService.selectByLike(keywords);
PageInfo<Adminuser> p = new PageInfo<>(adminuserList);
logger.info(JSON.toJSONStringWithDateFormat(p, "yyyy-MM-dd HH:mm:ss"));
}
打印结果:
将json传转换一下,在线转换网址:http://jsonviewer.stack.hu/
{
"endRow": 10,
"firstPage": 1,
"hasNextPage": true,
"hasPreviousPage": false,
"isFirstPage": true,
"isLastPage": false,
"lastPage": 3,
"list": [
{
"createtime": "2019-06-06 00:00:00",
"id": 1,
"loginNums": 0,
"password": "123456",
"realName": "andy",
"role": [
{
"id": 1,
"roleName": "超级管理员",
"rule": "*"
}
],
"roleId": 1,
"status": 1,
"telphone": "13228228288",
"username": "andy"
},
================这里省略了一些数据=====================
{
"createtime": "2019-06-07 00:00:00",
"id": 10,
"loginNums": 0,
"password": "888",
"realName": "hhh",
"role": [
{
"id": 10,
"roleName": "技术支持",
"rule": ""
}
],
"roleId": 2,
"status": 1,
"telphone": "888",
"username": "hhh"
}
],
"navigatePages": 8,
"navigatepageNums": [
1,
2,
3
],
"nextPage": 2,
"pageNum": 1,
"pageSize": 10,
"pages": 3,
"prePage": 0,
"size": 10,
"startRow": 1,
"total": 21
}
返回的数据时这种样式,说明分页成功了,接下来,我就把 list.jsp 代码也附出来:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>list</title>
</head>
<body>
<h1>用户管理</h1>
<form action="list.do" method="post">
<input type="text" name="keywords" autocomplete="on" value="${keywords}" />
<input type="submit" value="查找"/>
</form>
<h3><a href="toAdd">添加</a></h3>
<hr/>
<table border="1" cellpadding="0" cellspacing="0" width="80%">
<tr>
<th>ID</th>
<th>用户名</th>
<th>姓名</th>
<th>联系电话</th>
<th>角色</th>
<th>操作</th>
</tr>
<c:forEach items="${page.list}" var="u">
<tr>
<td>${u.id}</td>
<td>${u.username}</td>
<td>${u.realName}</td>
<td>${u.telphone}</td>
<c:forEach items="${u.role}" var="r">
<td>${r.roleName}</td>
</c:forEach>
<td>
<a href="toUpdate.do?id=${u.id}">修改</a>|
<a href="del.do/${u.id}">删除</a>
</td>
</tr>
</c:forEach>
</table>
<div align="center">
<font size="2">第 ${page.pageNum} 页,共${page.pages}页,${page.total} 条记录</font> <a href="list.do?page=1">首页</a>
<c:choose>
<c:when test="${page.pageNum - 1 > 0}">
<a href="list.do?page=${page.pageNum - 1}">上一页</a>
</c:when>
<c:when test="${page.pageNum - 1 <= 0}">
<a href="list.do?page=1">上一页</a>
</c:when>
</c:choose>
<c:choose>
<c:when test="${page.pages==0}">
<a href="list.do?page=${page.pageNum}">下一页</a>
</c:when>
<c:when test="${page.pageNum + 1 < page.pages}">
<a href="list.do?page=${page.pageNum + 1}">下一页</a>
</c:when>
<c:when test="${page.pageNum + 1 >= page.pages}">
<a href="list.do?page=${page.pages}">下一页</a>
</c:when>
</c:choose>
<c:choose>
<c:when test="${page.pages==0}">
<a href="list.do?page=${page.pageNum}">尾页</a>
</c:when>
<c:otherwise>
<a href="list.do?page=${page.pages}">尾页</a>
</c:otherwise>
</c:choose>
</div>
</body>
</html>
至此,分页就算是完成了,希望能帮到你!