pagehelper分页插件(SpringBoot,Mybatis整合前后端分析)

news2024/11/24 22:33:51

前言:在学习项目的过程中遇到了数据分页的功能,单纯的js前端不能处理大的数据量,需要后端整理好数据发送给前端,那么使用分页插件无疑是个好选择.

目录

pagehelper依赖

接口方法mapper

Mybatis

Service

ServiceImpl

PageResult类

返回数据类

Controller层

前端

打印出的数据

上一页,下一页功能实现

展示数据,搜索功能,跳转框功能实现


pagehelper依赖

            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.4.1</version>
            </dependency>

接口方法mapper

    // 根据名字模糊查询
    List<BookLibrary> findBookByName(String name);

Mybatis

这个sql完成的功能是:前端的搜索功能 和 展示数据 做出分页的效果。

如果name的值是 ’ 1l ‘ ,那么展示全部数据,否则 模糊查询,这里sql正常写就行(不用在意PageNum和PageSize参数,service层会重写)。

    <select id="findBookByName" resultType="com.ma.entity.BookLibrary">
        SELECT * FROM book_library
        WHERE
        <choose>
            <when test="name == '1l'">
                1=1
            </when>
            <otherwise>
                name LIKE CONCAT('%', #{name}, '%')
            </otherwise>
        </choose>
    </select>

Service

    List<BookLibrary> findBookByName(int pageNum,int pageSize,String name);

ServiceImpl

注意这一步操作:

 1.  如果要做分页需要两个条件 当前页pageNum,和每页的数量pageSize,以及我结合搜索功能的name,这三个参数。

2.  PageHelper.startPage(pageNum, pageSize); ,这步操作就是分页插件的分页,写在第一步。

3. 调用你的mapper接口正常的查询数据,注意查询数据的操作一定放在分页后面!

4. 新建出来PageInfo的类,把查询到的数据bookByPage放在pageInfo对象里。

5. 返回pegeInfoList集合。

    @Override
    public List<BookLibrary> findBookByName(int pageNum, int pageSize, String name) {
        PageHelper.startPage(pageNum, pageSize);
        List<BookLibrary> bookByPage = bookLibaryMapper.findBookByName(name);
        PageInfo<BookLibrary> pageInfo = new PageInfo<>(bookByPage);
        return pageInfo.getList();
    }

PageResult类

如果想要把这些数据给到前端直接用,那么需要一个类去存储分页的数据。

package com.ma.common;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.List;


@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class PageResult<T> {
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;

    //由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"

    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;

    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;

    //前一页
    private int prePage;
    //下一页
    private int nextPage;
    //是否为第一页
    private boolean isFirstPage;
    //是否为最后一页
    private boolean isLastPage;
    //是否有前一页
    private boolean hasPreviousPage;
    //是否有下一页
    private boolean hasNextPage;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;
    //导航条上的第一页
    private int navigateFirstPage;
    //导航条上的最后一页
    private int navigateLastPage;
}

返回数据类

package com.ma.common;

import lombok.Data;
import java.util.HashMap;
import java.util.Map;

@Data
public class R<T> {

    private Integer code; //编码:1成功,0和其它数字为失败

    private String msg; //错误信息

    private T data; //数据

    private Map map = new HashMap(); //动态数据

    public static <T> R<T> success(T object) {
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;
        return r;
    }

    public static <T> R<T> error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    public R<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

}

Controller层

1. 返回值是一个PageResult类存储分页的数据

2. 把前端传过来的值,直接交给service重写的方法findBookByName去进行分页操作。

3. 创建PageInfo类,把数据放进这个类中。

4. 创建存储分页数据的PageResult类

5. 把pageInfo里面分好的数据放到将要存储分页数据的PageResult类中,返回给前端。

(这里的set方法数据不一致,看PageResult类set设置去。)

    @GetMapping("/booklibrary/getBooksByPage/{name}")
    public R<PageResult> getBooksByPage(@RequestParam("pageNum") int pageNum, @RequestParam("pageSize") int pageSize, @PathVariable String name) {

        List<BookLibrary> bookByName = bookLibaryService.findBookByName(pageNum, pageSize, name);

        PageInfo<BookLibrary> pageInfo = new PageInfo<>(bookByName);
        PageResult<BookLibrary> pageResult = new PageResult<>();

        pageResult.setData(pageInfo.getList());
        pageResult.setTotalRecords(pageInfo.getTotal());
        pageResult.setCurrentPageNum(pageInfo.getPageNum());
        pageResult.setRecordsPerPage(pageInfo.getPageSize());
        pageResult.setTotalPages(pageInfo.getPages());

        return R.success(pageResult);
    }

到这里如果前端接口正常,就可以返回你设置的分页数据,去进行分页操作了。

前端

分页代码

        <div class="container mt-3">
            <ul class="pagination">
                <li class="page-item"><a class="page-link" id="prevBtn">上一页</a></li>
                <li class="page-item"><a class="page-link" onclick="findBookByName('1l',1)">1</a></li>
                <li class="page-item"><a class="page-link" onclick="findBookByName('1l',2)">2</a></li>
                <li class="page-item"><a class="page-link" onclick="findBookByName('1l',3)">3</a></li>
                <li class="page-item"><a class="page-link" id="nextBtn">下一页</a></li>
                <span id="totalRecords" style="margin-left: 20px;"></span>
                <input type="text" id="pageNumInput" style="width: 80px; height: 40px;margin-left: 20px;">
                <button type="button" class="btn btn-info" id="jumpButton" onclick="jumpToPage()">跳转</button>
            </ul>

        </div>

展示部分代码

let name = "1l"; // 查询全部
let pageNum = 1;
let pageSize = 5;

function findBookByName(name, pageNum) {
    let url = '/booklibrary/getBooksByPage/' + encodeURIComponent(name) + '?pageNum=' + pageNum + '&pageSize=' + pageSize;
    $.ajax({
        url: url,
        type: 'GET',
        dataType: 'json',
        contentType: 'application/json',
        headers: {
            'Authorization': 'Bearer ' + token
        },
        success: function (response) {
            console.log(response)

            let totalRecords = response.data.totalRecords; // 总共有几条数据
            let totalPages = response.data.totalPages;  // 当前页的记录数
            let currentPageNum = response.data.currentPageNum; // // 总页数

      $('#totalRecords').text("总共:" + totalRecords + "条数据         " + "第" + currentPageNum + "/" + totalPages + "页");

打印出的数据

上一页,下一页功能实现

            $('#prevBtn').off().click(function () {
                if (pageNum > 1) {
                    pageNum--;
                    findBookByName(name, pageNum);
                } else {
                    // 已经是第一页,弹出提示框
                    alert("已经是第一页");
                }
            });

            $('#nextBtn').off().click(function () {
                if (pageNum < totalPages) {
                    pageNum++;
                    findBookByName(name, pageNum);
                } else {
                    // 已经是最后一页,弹出提示框
                    alert("已经是最后一页");
                }
            });

展示数据,搜索功能,跳转框功能实现

// 页面初始化数据
findBookByName(name, pageNum);


// 显示全部数据
function findBookByNameAll() {
    findBookByName("1l", pageNum);
}


// 搜索
function search() {
    let name = $('#searchValue').val().trim().replace(/\s/g, '');
    findBookByName(name, pageSize);
}

// 跳转到指定页码
function jumpToPage() {
    let pageNum = parseInt($('#pageNumInput').val());

    if (isNaN(pageNum) || pageNum < 1) {
        alert('请输入有效的页码');
        return;
    }
    findBookByName("1l", pageNum);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/616712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[IJCAI 2022] 基于个性化掩码的实用安全联合推荐

Practical and Secure Federated Recommendation with Personalized Mask | SpringerLink 摘要 联合推荐解决了推荐系统的数据筒仓和隐私问题。目前的联合推荐系统主要利用密码学或混淆方法来保护原始评分不被泄露。然而&#xff0c;前者带来了额外的通信和计算成本&#xff0…

day 49 :121. 买卖股票的最佳时机;122. 买卖股票的最佳时机 II;123. 买卖股票的最佳时机 III

买卖股票 121. 买卖股票的最佳时机&#xff1a;一次买入卖出1. 贪心算法2. 动态规划1. dp数组以及下标名义2. 递归公式3. dp数组如何初始化4. 代码 122. 买卖股票的最佳时机 II:可以多次买入卖出2. 动态规划1. dp数组以及下标名义2. 递归公式3. dp数组如何初始化4. 代码 123. 买…

Linux_进程

目录 一.进程概念与子进程 1.进程基本概念 2.通过系统调用创建子进程-fork 二.进程状态 1、一般进程状态 2、Linux操作系统的进程状态 三.环境变量 1.概念 2.环境变量组织与获取 3.配置文件 4.环境变量的全局属性​编辑 5.命令行参数 四.进程优先级 1.查看系统进…

Linux文件系统-磁盘划分

一、磁盘使用 windows系统中&#xff1a; 1、分区 2、格式化 3、自动装载 4、使用 Linux系统中&#xff1a;1、分区 2、格式化 3、手动挂载 &#xff08;挂载到/etc/fstab实现开机自启&#xff09; 4、使用 Linux系统中磁盘使用&#xff1a; 1、分区操作…

rust:cargo 和rustc 以及一点 小技巧

在正式学习 Rust 语言以前&#xff0c;我们需要先学会怎样输出一段文字到命令行&#xff0c;这几乎是学习每一门语言之前必备的技能&#xff0c;因为输出到命令行几乎是语言学习阶段程序表达结果的唯一方式。 在之前的 Hello, World 程序中大概已经告诉了大家输出字符串的方式…

system V共享内存

一、前言 共享内存是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递将不再涉及到内核&#xff0c;换句话说&#xff0c;进程将不再通过执行进入系统内核的系统调用来传递彼此的数据。 但其实比它好用的进程间通信还有很多种&…

Android HTTP请求方式:HttpClient

1.HttpClient使用流程 基本流程&#xff1a; 2.HttpClient使用示例 1&#xff09;使用HttpClient发送GET请求 直接贴下简单的发送Get请求的代码&#xff1a; public class MainActivity extends Activity implements OnClickListener { private Button btnGet; private WebV…

什么是OSPF被动接口?如何配置?华为、思科、瞻博网络三厂商命令来了

OSPF&#xff08;开放最短路径优先&#xff09;是一种常用的动态路由协议&#xff0c;用于在大型网络中实现路由选择。在OSPF中&#xff0c;被动接口是一种特殊类型的接口&#xff0c;它被用来监测网络中的邻居关系&#xff0c;并接收来自邻居发送的Hello消息。被动接口不主动发…

华为OD机试之在字符串中找出连续最长的数字串(含“+-”号)(Java源码)

在字符串中找出连续最长的数字串(含“”号) 输入描述 请在一个字符串中找出连续最长的数字串&#xff0c;并返回这个数字串。 如果存在长度相同的连续数字串&#xff0c;返回最后一个。 如果没有符合条件的字符串&#xff0c;返回空字符串””。 注意&#xff1a; 数字串可以由…

Ansible进阶2——角色管理

文章目录 一、角色1.1 获取角色方式1.2 角色结构1.3 定义变量和默认变量1.4 使用方法1.5 控制playbook中的任务执行流程 二、红帽企业Linux系统角色2.1 常见系统角色2.2 使用系统时间同步角色 三、自定义角色3.1 创建角色目录结构3.2 编写角色内容3.3 编写总结 四、ansible gal…

【C++】内存管理的基本操作,new与delete的实现原理以及operator new与operator delete函数

文章目录 前言一、new,delete操作内置类型二、new/delete操纵自定义类型3. operator new与operator delete函数4. new/delete实现原理4.malloc/free和new/delete的区别 前言 程序中内存的划分&#xff1a; 栈又叫堆栈–非静态局部变量/函数参数/返回值等等&#xff0c;栈是向…

高考必胜,归来仍是少年!

高考必胜&#xff0c;归来仍是少年&#xff01; 这是小索奇专门为高考生写的文章高考生 我以前给大家弄过一些免费的付费资料&#xff0c;现在看到后台很多伙伴们都在寻找资料&#xff0c;一些没有充分准备的小伙伴此刻一定很匆忙吧&#xff01; 我想对大家说&#xff1a; 高…

基于 FFMPEG 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)

系列文章目录 基于 FFMPEG 的跨平台视频播放器简明教程&#xff08;一&#xff09;&#xff1a;FFMPEG Conan 环境集成 文章目录 系列文章目录前言基础知识视频&#xff0c;你所看到的&#xff01;音频 - 你所听到的声音编解码器 - 压缩数据容器 - 存放音频和视频的地方 解封…

vue3.0与vue2.0的区别简记(基于官方文档)

vue3.0与vue2.0的区别简记&#xff08;基于官方文档&#xff09; 基于vue3.0和vue2.0官方文档简单记录vue3.0版本和2.0版本的区别。 一直没有看文档的习惯&#xff08;就是不爱学习&#xff0c;现在吃了没文化的亏&#xff09;&#xff0c;遇到问题才去补充点食粮&#xff0c…

祝2023高考考生高考顺利!金榜题名

前言&#xff1a;光阴似箭&#xff0c;岁月如梭。明天就是全国每年一次的高考了&#xff0c;我也即将结束我的大一生活成为一名大二的小学长啦嘿嘿。而我今天呢主要是想祝马上要高考的学弟学妹们高考顺利&#xff0c;金榜题名&#xff0c;并且借此机会顺便讲讲我的高考前后的故…

解决python通过pip离线安装flask,numpy报错解决(centos)

1. 离线安装Python https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz 解压&#xff0c;编译&#xff0c;安装 tar xzvf Python-3.7.1.tgz ./configuremakemake install 离线环境下如果系统不是完整版安装编译会报错&#xff0c;需要解决依赖问题&#xff0c;如下&am…

5 种常见的 Linux 打包类型:tar、gzip、bzip2、zip 、 7z

在 Linux 系统中&#xff0c;打包和压缩文件是常见的操作。不同的打包类型适用于不同的用途和需求。本文将详细介绍 5 种常见的 Linux 打包类型&#xff0c;包括tar、gzip、bzip2、zip 和 7z&#xff0c;以及它们的特点、使用方法和适用场景。 1. tar tar&#xff08;tape arc…

音悦台项目测试报告

文章目录 项目背景项目功能测试计划与设计功能测试自动化测试 测试结果功能测试结果UI自动化测试结果 项目背景 现如今人们的生活压力大&#xff0c;容易使人疲惫&#xff0c;为了使得人们在闲暇之余可以听音乐放松&#xff0c;为此设计出一款轻量的听音乐网站&#xff0c;快速…

centos安装部署Kubernetes(k8s)步骤使用kubeadm方式

文章目录 1、修改系统配置2、安装docker应用3. 拉取docker镜像4、cri-dockerd安装5、安装kubeadm和kubelet6、配置flannel网络插件7、Node节点加入集群操作 机器地址&#xff1a; 192.168.0.35 k8s-master 192.168.0.39 k8s-node1 192.168.0.116 k8s-node2 1、修改系统配置 修…

Web应用技术(第十六周/持续更新)

本次联系基于how2j的教程完成对SpringBoot的初步学习。 初识Springboot 学习导入&#xff1a;1.第一个基于SpringBoot的项目&#xff1a;&#xff08;1&#xff09;application.java&#xff1a;该文件中的核心代码&#xff1a; &#xff08;2&#xff09;HelloController.jav…