spring+springmvc+mybatis+maven中使用PageHelper插件实现分页

目前小编在学习spring+springmvc+mybatis+maven整合开发,在开发后台的时候肯定会用到分页,度娘上面各种五花八门的,代码长串长串的,就没一个能实现的。今天刚填完坑,所以记录一下!

1、首先展示一下效果吧,此处我也写了模糊查询的,当然我没有写css样式,但是功能实现了。

spring+springmvc+mybatis+maven中使用PageHelper插件实现分页

模糊查询展示 

spring+springmvc+mybatis+maven中使用PageHelper插件实现分页

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>

spring+springmvc+mybatis+maven中使用PageHelper插件实现分页

(2)、在maybatis配置文件中添加一下代码(我的配置文件:spring-mybatis.xml)      

       <!-- 分页插件 -->

       <property name="plugins">

           <array>

           <!-- com.github.pagehelperPageHelper类所在包名 -->

               <bean class="com.github.pagehelper.PageHelper">

                   <property name="properties">

                       <value>

                           dialect=mysql

                       </value>

                   </property>

               </bean>

           </array>

       </property> 

重点说一下:此段代码不能放错位置,否则你会发现,PageHelper.startPage(pageNum, pageSize);不管怎么都不能生效!

spring+springmvc+mybatis+maven中使用PageHelper插件实现分页

(3)、在xxxMapper.xml中写你的SQL语句:(我的是:AdminuserMapper.xml)

<!--

  用户角色关联模糊查询(根据用户名)

  id="getByLike":对应dao(持久层)AdminuserMappergetByLike()方法

  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默认值是1pageSize默认是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"));

   }

打印结果:

spring+springmvc+mybatis+maven中使用PageHelper插件实现分页

将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>

至此,分页就算是完成了,希望能帮到你!