SpringBoot中mybatis分页插件的使用--【pagehelper组件】

news2024/11/17 13:20:25

SpringBoot系列文章目录

SpringBoot知识范围-学习步骤【JSB系列之000】

文章目录

  • SpringBoot系列文章目录
    • 本系列校训
  • SpringBoot技术很多很多
  • 环境及工具:
  • 上效果图
  • 目前流行的mybatis分页插件
  • 在Spring Boot里使用pagehelper
    • JAVA查询列表时
    • 页面上的使用
    • 还要注意的是
  • 配置文件设置
  • 配套资源
  • 作业:

本系列校训

用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干!
只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知!

SpringBoot技术很多很多

本文专指mybatis分页,可以是SSM的项目,也可以是springBoot 的项目里的mybatis,或者mybatis plus
在这里插入图片描述

韩顺平说:学习JAVA的人有两大难
第一困惑,JAVA能百度到的知识太多太多,完全不知道学啥
第二困惑,就是不知道以什么样的顺序去学,有的时候乱看一堆视频有遗漏,有的时候,两边的视频还有重复。
Spring的外围技术就更多了。其实,分页插件就是其中之一。
在这里插入图片描述
所以,学习东西要系统一些,如果基本功不够,那后面的技术就会学的很浮。

环境及工具:

本系列环境

环境win11
工具idea 2017/idea 2018
jdk1.8
数据库mysql5.5
maven3.2.1
项目导入方式maven 导入
数据库前端工具mysql-front (navicat 也可以)

数据库前端工具:mysql-front (navicat 也可以)
主要是这些跟PHPStudy 2018 整合了,所以有的时候懒的打开navicat
关于环境的重要性,直接看上面的《SpringBoot 的项目编译即报错处理–JSB系列之001》

上效果图

不管是啥系统,信息都不太可能一页就显示完成,这个时间就需要列表,还有分页。事实上连微信小程序也是要分页的,只是它的翻页是手拉屏幕向上的时候,屏幕有一个转圈的小动作,然后,下一页的内容就出来。不过,现在讲的是服务端的代码

在这里插入图片描述

现在的系统分页主要就是这么三种情况
1 数据都推动前端,用JS分页。
2 把数据集查出来,JAVA代码分页
3 在数据库里只查那一页的数据。

一、使用前端表格插件进行分页
有很多的table 页面组件都支持这种。

  • 特别特别适合于字典类的数据。
    -优点也是特别明显,就是根本就不用你考虑,把全部的数据集往 前面一扔就行了。JS都是组件写好的,
    例如用bootstrap的拓展table组件,JS的这样的table 有不少
    优点:实现简单,直接设置前端table组件的参数即可。
    缺点:从其实现原理上即可看出,这个数据是用户请求一次,服务器会将该表的所有数据返回到前端,刷新界面和点击下一页的操作的时候都会重复以上操作。显示数据的速度会因为网络带宽、服务器压力等而变慢。
    所以,这种方式不能用于业务数据,那完全就是灾难
    JSTable是一个灵活的、强大的动态表格插件,HTML表互动与排序、过滤和分页功能。灵感来自Vanilla-DataTables和datatable jQuery插件。基础调用new JSTable。
    layui 也有这种分页表格。
    甚至就是现在主流的VUE也有这种表格vue + el-table +Print.js 实现前端打印分页多页表格。
    要特别注意的是,当这个字典表的记录很少(小于1000)的时候,这种一次性全查出来,并不会引起性能的下降,反而这种效率还最高。
    这主要就是因为这种表一般都会被优化。要么放在缓存里,要么就用alter table cache将字典直接放入内存。

如果建表或是修改表时指定了Cache子句,则当用户第一次访问表中的数据是,这个表将被加入到数据库高速缓存中并保留较长一段时间,
如果建表或是修改表时指定了Cache子句,则当用户第一次访问表中的数据是,这个表将被加入到数据库高速缓存中并保留较长一段时间,这样用户以后再次访问该表是,可直接访问数据库高速缓存中的数据,从而提高访问的速度。
因此建议对一些较小的,,用户访问频繁的表,可以考虑加上cache子句,以提高访问效率。常见如用户表,权限表,角色表,部门表等。
修改表的语句示例为:
alter table TB_SYS_USER cache;
alter table TB_SYS_USER_dept cache;
alter table TB_SYS_USER_role cache;

所以千万学了一个半桶水的固定思维说,现在都是SQL分页了,前台分页这种早就淘汰等等。
二、后端用代码实现分页
用JAVA代码来切分list

就是根据当前第几页,每页显示几条数据进行分页数据的处理。

优点:无,应该说是为了学员的练习吧。不各道为啥这样,跟前端分页比,有代码量,跟SQL分页比,它速度也没快。
一次请求只会向前端返回一页的数据,浏览器需要接收的数据变少了,页面展示会变快

缺点:前台页面分页的缺点,SQL分页的缺点它都有了。
如果强说一个优点,那就是不用管啥数据库,这样对于一些老项目还是有独到的地方

三、数据库用sql语句实现
以MySQL为例, select * from sys_order limit 0,10 //从第0条开始查,一共查询10条记录
优点:真正实现了从数据库就是分页处理
也是业务表最主流的分页技术。
甚至还有了oracle 分页语句,sqlserver 分页语句的不少讨论
oracle

SELECT * FROM (
SELECT t.*, ROWNUM RN
FROM (SELECT * FROM table_name ORDER BY column_name ASC) t
WHERE ROWNUM <= :page * :size
)
WHERE RN > (:page - 1) * :size;

SQLSEVER

select * from 
(
  select ROW_NUMBER()over(order by StuNo asc) id,*  from  Student
)Student
where id between @startIndex and @endIndex

目前流行的mybatis分页插件

插件1 Mybatis-plus

插件2 pagehelper
要说明的是,并不是 springBoot 项目里存在的这两种插件,事实上,在mybatis 的时候,就一直存在。
比如在SSM的项目中。
在mybatis的pom中添加分页插件依赖

<dependency>
<groupId>com.github.pagehelper</groupId>  
<artifactId>pagehelper</artifactId>
<version>5.2.0</version> //版本号
</dependency>

在mybatis-config.xml中创建分页插件

<plugins>
<!--分页插件-->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

在查询的JAVA语句中:

   @Test
    public void selectPageTest() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);//获取映射方法
        Page<Object> objects = PageHelper.startPage(1, 6);       //创建分页插件对象
        List<Emp> list = mapper.selectByExample(null);           //查询对象
        list.forEach(System.out::println);
        System.out.println(objects);
    }

在Spring Boot里使用pagehelper

第一步那肯定就是pom的引入了。
在这里插入图片描述

 <!--  mybatis分页插件-->
        <!--导入pagehelper相关依赖-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.2</version>
        </dependency>

在项目的配置文件 里
在这里插入图片描述
配置类。这里可以参见《SpringBoot 的配置类–JSB系列之003》
在这里插入图片描述

这里一定要把这个知识点弄懂,还有就是配置类的运行顺序。

package com.code;

import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
import com.github.pagehelper.PageHelper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import java.io.IOException;
import java.util.Properties;


//mybatis 分页插件 参数配置

@Configuration
@EnableTransactionManagement
@MapperScan("com.code.mapper")
public class PageHelperConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor page = new PaginationInterceptor();
        page.setDialectType("mysql");
        return page;
    }

    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor page = new PerformanceInterceptor();
        page.setFormat(true);
        return page;
    }

    //配置mybatis的分页插件pageHelper
    @Bean
    public PageHelper pageHelper(){
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("offsetAsPageNum","true");
        properties.setProperty("rowBoundsWithCount","true");
        properties.setProperty("reasonable","true");
        properties.setProperty("dialect","mysql");    //配置mysql数据库的方言
        pageHelper.setProperties(properties);
        return pageHelper;
    }

}

比较贴心的是PaginationInterceptor 这个类是插件带的
在这里插入图片描述

JAVA查询列表时

在这里插入图片描述

 /**
     * @param keyword  搜索关键词
     * @param p        页面            默认第1页
     * @param pageSize 每页显示条数 默认每页10条
     * @param model
     * @return
     */
    @RequestMapping("/list") //分页查询数据
    public String list(String keyword, Integer p, Integer pageSize, Model model) {

        p = null == p ? 1 : p; //默认显示第一页
        pageSize = null == pageSize ? 10 : pageSize; //默认每页显示10条
        Page<Userinfo> sortPage = new Page<Userinfo>(p, pageSize);//参数一是当前页,参数二是每页个数
        List<Userinfo> userinfoList = userinfoMapper.selectPage(sortPage, null);
        long total = sortPage.getTotal(); //总页数
        int current = sortPage.getCurrent();
        long pages = sortPage.getPages();
        model.addAttribute("userinfoList", userinfoList);   //绑定接受参数
        model.addAttribute("cp", current);   //当前页
        model.addAttribute("tp", pages);   //总页数
        model.addAttribute("total", total);   //总条数
        model.addAttribute("pageListURL", "userinfo/list");   //总条数
        return "userinfo/userinfoList";
    }

页面上的使用

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%--分页代码--%>
<%--项目绝对路径--%>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<div style="text-align: center">
    <div class="layui-btn-group">
        <a href="${ctx}/${pageListURL}?p=1" class="layui-btn layui-btn-primary layui-btn-sm">首页</a>
        <c:if test="${cp>1}">
            <a href="${ctx}/${pageListURL}?p=${cp-1}"
               class="layui-btn layui-btn-primary layui-btn-sm">上一页</a>
        </c:if>
        <%--前后各显示3个页码--%>
        <c:forEach begin="${cp-3>1?cp-3:1}" end="${cp+3<tp?cp+3:tp}" var="k">
            <c:if test="${cp==k}">  <%-- 是当前页--%>
                <a href="${ctx}/${pageListURL}?p=${k}" class="layui-btn  layui-btn-sm">${k}</a>
            </c:if>
            <c:if test="${cp!=k}"> <%-- 不是当前页--%>
                <a href="${ctx}/${pageListURL}?p=${k}"
                   class="layui-btn layui-btn-primary layui-btn-sm">${k}</a>
            </c:if>
        </c:forEach>

        <c:if test="${cp<tp}">
            <a href="${ctx}/${pageListURL}?p=${cp+1}"
               class="layui-btn layui-btn-primary layui-btn-sm">下一页</a>
        </c:if>
        <a href="${ctx}/${pageListURL}?p=${tp}" class="layui-btn layui-btn-primary layui-btn-sm">尾页</a>
        <button class="layui-btn layui-btn-primary layui-btn-sm">共${total}条记录</button>
    </div>
</div>

从页面代码就可以看出,pagehelper的功能还是挺强大
在这里插入图片描述

还要注意的是

如果项目里使用了shiro 的话,一定要把 验证码的URL放出来,不然的话,你的验证码的路径被你自己的shiro 敌我不分的胡乱杀掉了。
这里就不详细说了,这个知识点涉及的问题比较多。

/**
	 * 配置shiro的过滤器
	 */
	@Bean(SHIRO_FILTER)
	public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
		ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
		// 设置安全管理器
		factoryBean.setSecurityManager(securityManager);
		// 设置未登陆的时要跳转的页面
		factoryBean.setLoginUrl(loginUrl);
		Map<String, String> filterChainDefinitionMap = new HashMap<>();
		// 设置放行的路径
		if (anonUrls != null && anonUrls.length > 0) {
			for (String anon : anonUrls) {
				filterChainDefinitionMap.put(anon, "anon");
			}
		}
		filterChainDefinitionMap.put("/static/**", "anon"); // 先把页面全放行了,不然调 试起来太麻烦了 ,by项目花园范德彪
		filterChainDefinitionMap.put("/code/**", "anon"); //这里要注意的是把验证码的URL放出来,不然不会显示到登陆上。by项目花园范德彪
		
		// 设置登出的路径
		if (null != logOutUrl) {
			filterChainDefinitionMap.put(logOutUrl, "logout");
		}
		// 设置拦截的路径
		if (authcUlrs != null && authcUlrs.length > 0) {
			for (String authc : authcUlrs) {
				filterChainDefinitionMap.put(authc, "authc");
			}
		}
		Map<String, Filter> filters=new HashMap<>();
//		filters.put("authc", new ShiroLoginFilter());
		//配置过滤器
		factoryBean.setFilters(filters);
		factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
		return factoryBean;
	}

成功之后就可以展示出效果图的样子了。

配置文件设置

项目目录,不能有中文或空格,就乖乖的用C语言能识别的变量名是最好的

#运行端口号
server.port=8889
#配置项目路径
server.servlet.context-path=
#数据库连接配置信息  Ctrl+/ 注释
#mysql8驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#mysql5驱动   记得把连接地址换成本机ip地址
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/jsbperson_db?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=123456
#mybatis配置
mybatis.type-aliases-package=com.code.entity
#mybatis.mapper-locations=classpath*:mapper/*.xml
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
#jsp视图解析器
spring.mvc.view.prefix=/view/
spring.mvc.view.suffix=.jsp
#文件上传的配置
spring.servlet.multipart.max-file-size=120MB
spring.servlet.multipart.max-request-size=120MB
#开启日志调试
#logging.level.root=debug
#显示mybatis日志
logging.level.com.code.mapper=debug

要注意的是启动的端口号,
数据源里的datasource 的名字。用户名,密码。还有就是mysql 的驱动是com.mysql.jdbc.Driver
总的来说,
com.mysql.jdbc.Driver 是 mysql-connector-java 5.5之前的,
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6及6之后的的,
初学者容易陷入一个误区,就是什么东西最新版是最好的,事实上很有可能他写的东西,明明JDK6.0就完全足够。一边喊着自己的机器内存不足,一边让内存运行着他自己用不到的东西。就比如说idea应该算是这些开发者工具里最卡的。有人可能明明只是打开几个网页,那为什么不使用webstorm? 甚至不是写很多代码的时候,为什么不选择更轻量级的VSCode?

配套资源

SpringBoot中mybatis分页插件的使用–【pagehelper组件】
https://download.csdn.net/download/dearmite/88136248

作业:

无,看懂即是神
范德彪经典语录: 学pagehelper,你不能按套路出牌
在这里插入图片描述

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

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

相关文章

零基础强化学习入门分享

&#xff08;一&#xff09;前言&#xff1a;强化学习入门顺序。 以前主要学习硬件PCB单片机等知识&#xff0c;后来接触的项目也大多与电气相关&#xff0c;从一窍不通到稍微找到点门道&#xff0c;中间走过不少弯路&#xff0c;误打误撞中&#xff0c;也留下了一些经验。 我的…

【音视频处理】转封装实战,文件转直播流,FFmpeg代码示例讲解

大家好&#xff0c;欢迎来到停止重构的频道。 从本期起&#xff0c;我们正式进入音视频处理的介绍。 本期我们讨论音视频文件转封装&#xff0c;如将MP4转AVI、MP4转RTMP等。 内容中所提及的代码都会放在GitHub&#xff0c;感兴趣的小伙伴可以到GitHub下载。 我们按这样的顺…

数据科学与大数据专业好就业么

好不好就业取决于你个人的学习能力和技术水平能否达到企业应聘的要求&#xff0c;最直观的方法就是可以搜下你想要工作城市的应聘要求&#xff0c;然后对应着技术点进行技能提升 猎聘大数据研究院发布了《2022未来人才就业趋势报告》 从排名来看&#xff0c;2022年1-4月各行业…

最强实战,Web自动化测试Python+Selenium3+PO+Yaml+DDT框架封装(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 设计思路 框架采…

23款奔驰C260 L更换内饰最全发光套件,提升车内氛围感

原厂1:1设计&#xff0c;免编程匹配&#xff0c;无损安装&#xff0c;可升级项目&#xff1a; 1、碳纤维中控氛围灯&#xff08;阿凡达水滴款&#xff09; 2、发光前风口&#xff1b; 3、发光后风口&#xff1b; 4、发光座椅背气氛灯&#xff1b; 5、中音发光盖板 6、主动…

LGViT : Dynamic Early Exiting for Accelerating Vision

摘要 近年来&#xff0c;在资源有限的边缘设备上高效部署和加速功能强大的视觉变压器&#xff08;ViTs&#xff09;已成为一个很有吸引力的任务。虽然早期退出是加速推理的一个可行的解决方案&#xff0c;但大多数工作都集中在自然语言处理&#xff08;NLP&#xff09;中的卷积…

1.Kubernetes

文章目录 KubernetesK8S概述作用为什么使用K8S主要功能Kubernetes 集群架构与组件总结&#xff1a; 核心组件Master组件Kube-apiserverKube-controller-managerKube-scheduler工作 配置存储中心etcd Node组件KubeletKube-Proxydocker 或 containerd 总结&#xff1a; 工作流程K…

【电源专题】电压查表法显示电量的原理与缺点

在文章:【电源专题】电量计估计电池荷电状态方法(开路电压法及库仑计法)的差别中我们讲到电量计估计荷电状态的方法。其中开路电压法实现方法较容易,可借着开路电压对应荷电状态查表而得到。 那么为什么能够使用电压查表法去预估电池容量呢?如下所示如果我们往一个有刻度…

SpringBoot复习:(16)TomcatStarter

直接在idea里运行SpringBoot程序时&#xff0c;内嵌的tomcat容器会调用TomcatStarter这个类的onStartup方法。TomcatStarter继承自ServletContainerInitializer 其onStartup方法会调用ServletContextInitializer&#xff08;不是ServletContainerInitializer)的onStartup方法.…

你玩过Java实现的猜数字小游戏嘛?Let‘s Go

你玩过Java实现的猜数字小游戏嘛&#xff1f;Lets Go 分析过程代码实现小结Time 分析过程 首先&#xff1a;猜数字得有个数字先是吧&#xff0c;随机数获取用的是Math.random()函数 math.random()函数&#xff1a;是取[0,1)之间的随机数 math.random()*100&#xff1a;表示[0,1…

利用鸿鹄快速构建公司IT设备管理方案

需求描述 相信应该有一部分朋友跟我们一样&#xff0c;公司内部有很多各种各样的系统&#xff0c;比如资产管理、CRM、issue管理等等。这篇文章介绍下&#xff0c;鸿鹄是如何让我们的资产系统&#xff0c;按照我们的需求展示数据的。 我们的资产管理系统&#xff0c;是使用开源…

JVM问题

1. jvm运行时区域划分及每个区域的作用 堆、方法区&#xff08;元空间&#xff09;、虚拟机栈、本地方法栈、程序计数器 2. 堆内存分配策略&#xff1a;新生代&#xff0c;老年代&#xff0c;gc时机 • 对象优先分配在Eden区&#xff0c;如果Eden区没有足够的空间进行分配时&am…

消息疯狂堆积!RocketMQ出Bug了?

前言 用过 MQ 的同学&#xff0c;可能会遇到过消息堆积的问题。而肥壕最近也踩上了这个坑&#xff0c;但是发现结果竟然是这么一个意料之外的原因而导致的。 正文 那一晚月黑风高&#xff0c;肥壕正准备踏上回家的路&#xff0c;突然收到告警短信轰炸&#xff01;“MQ 消息堆…

Redis的基础

一、进入redis 内部 / 关闭 # 方式一&#xff1a; // 进入redis redis-cli // 有密码输入密码 &#xff1a;auth [username] password auth 123456 # 方式二&#xff1a; // 进入redis 并且输入密码 redis-cli -a 123456// 如果在docker 里面的则可以 docker exec -it redis…

【腾讯云 Cloud Studio 实战训练营】云上编程永不宕机,彻底释放电脑物理内存

文章目录 前言一、快速上手1、账号注册2、新建工作空间3、配置工作空间参数4、工作空间展示5、运行飞机大战代码6、运行五子棋代码7、运行贪吃蛇代码 二、空间模板三、应用推荐1、点击 Fork2、等待工作空间启动3、安装 Dependencies4、运行 App 四、注意事项1、openai api key …

【云原生】深入掌握k8s中Pod和生命周期

个人主页&#xff1a;征服bug-CSDN博客 kubernetes专栏&#xff1a;kubernetes_征服bug的博客-CSDN博客 目录 1 什么是 Pod 2 Pod 基本操作 3 Pod 运行多个容器 4 Pod 的 Labels(标签) 5 Pod 的生命周期 1 什么是 Pod 摘取官网: Pod | Kubernetes 1.1 简介 Pod 是可以在 …

基于dockerfile构建sshd、httpd、nginx、tomcat、mysql、lnmp、redis镜像

一、镜像概述 Docker 镜像是Docker容器技术中的核心&#xff0c;也是应用打包构建发布的标准格式。一个完整的镜像可以支撑多个容器的运行&#xff0c;在Docker的整个使用过程中&#xff0c;进入一个已经定型的容器之后&#xff0c;就可以在容器中进行操作&#xff0c;最常见的…

Android四大组件之服务

为什么要使用服务呢&#xff1f; 从上面的文字说&#xff0c;我们知道这个服务是用于执行长期后台运行的操作。有些时候&#xff0c;我们没有界面&#xff0c;但是程序仍然需要工作。比如说&#xff0c;我们播放音乐&#xff0c;在后台播放音乐。比如说&#xff0c;我们下载任…

SLAM精度测评——EVO进阶再进阶

分别观察单个坐标轴差异 1.1 观察x轴差异 evo_ape tum truth.txt pose.txt -r trans_part -va --plot --plot_mode xz

鲁大师7月新机性能/流畅/久用榜:骁龙8 Gen2领先版亮相,性能跑分再破新高

摘要&#xff1a;iQOO 11S突破上限&#xff0c;红魔8S Pro再创新高 继五月六月&#xff0c;搭载天玑9200的机型相继迎来上市之后&#xff0c;高通也终于按耐不住。 本月所有上市的新机均搭载高通骁龙系列芯片&#xff0c;其中骁龙8 Gen2领先版迎来首次亮相&#xff0c;除了主打…