pageHelper分页及工作原理浅析

2023-10-30

1、pageHelper

PageHelper是Github上开源的MyBatis分页插件,使用起来简单、方便,支持多种数据库。
在这里插入图片描述
Github网址:
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md。

maven:

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

2、配置

在项目配置文件application.properties中配置pagehelper的方言
例如配置为mysql:
pagehelper.helper-dialect=mysql

配置时,可以使用下面的缩写值:

oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby

特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。

ps: 我什么都没有配置也没发现什么问题。。。

3、使用方法

pageHelper的使用非常简单,只需要在分页查询逻辑前添加一行代码即可,代码:

PageHelper.startPage(pageNum, pageSize);

// pageNum:页数(第几页)

// pageSize:每页的数据行数

例如:
在这里插入图片描述

4、工作原理

  1. 使用PageHelper.startPage时在当前线程上下文中设置一个ThreadLocal变量
  2. 在 ThreadLocal中设置了分页参数,之后在查询执行的时候,获取当前线程中的分页参数
  3. 执行查询的时候通过拦截器在sql语句中添加分页参数,之后实现分页查询,查询结束后在 finally 语句中清除ThreadLocal中的查询参数

PageHelper方法使用了静态的ThreadLocal参数,分页参数和线程是绑定的。只要可以保证在PageHelper方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为PageHelper在finally代码段中自动清除了ThreadLocal存储的对象。

下面这样的代码,就是不安全的用法:

PageHelper.startPage(1,10);
Listlist;
if(param1!=null){   
    list=countryMapper.selectIf(param1);
} else { 
  // 如果程序走到这个逻辑分支,程序中当前的分页参数无法清除 
  list=newArrayList();
}

应该改写为:

List list;
if(param1!=null) {
	PageHelper.startPage(1,10);   
	list=countryMapper.selectIf(param1);
} else {    
	list=newArrayList();
}

参考:https://baijiahao.baidu.com/s?id=1645186885613613303&wfr=spider&for=pc
https://blog.csdn.net/qq_35915384/article/details/80203003
https://www.jianshu.com/p/ab9703237a44

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pageHelper分页及工作原理浅析 的相关文章

  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • 如何在 Java 中创建接受多个值的单个注释

    我有一个名为 Retention RetentionPolicy SOURCE Target ElementType METHOD public interface JIRA The Key Bug number JIRA referenc
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数

随机推荐

  • OV7670循迹算法整理

    资源在这 http download csdn net download hello world12138 9910603 2016 7 3 1 今天发现一个比较尴尬的问题 之前摄像头采集到的图像和现实中我显示的图像的旋转方向根本就是反的
  • vivado路径最大时钟约束_【Vivado使用误区与进阶】XDC约束技巧之时钟篇

    Xilinx 的新一代设计套件Vivado中引入了全新的约束文件XDC 在很多规则和技巧上都跟上一代产品ISE中支持的UCF大不相同 给使用者带来许多额外挑战 Xilinx工具专家告诉你 其实用好XDC很容易 只需掌握几点核心技巧 并且时刻
  • Springboot 配置动态多数据源(Mybatis-plus)

    前言 在项目中需要用到动态切换多数据源 查阅Mybatis plus文档得知可以通过 DS注解 但该方法主要针对不同内容的数据源 而目前场景是相同内容的数据库需要在运行时根据请求头动态切换 因此文档方法不适用 注意 不要使用dynamic
  • C语言,使用指针封装函数,实现字符串拷贝,void MyStrcpy(char *p,char *q)

    使用指针实现字符串拷贝 include
  • Docker进阶学习:Raft一致性协议

    双主双从 假设一个结点挂了 其他结点是否可以用 我们接着上面的集群可以做实验 就是我挂掉一个主机的docker服务 看这个swarm可不可以 启动docker服务 sudo systemctl start docker 停止docker服务
  • 在处理el-select数据回显时遇到的问题

    在开发vue项目的时候 会普遍的用到elementUI组件库 当用道其中的下拉框组件时 会遇到一点儿问题 先看如下代码
  • IC设计常用文件及格式介绍

    GDSII 它是用来描述掩模几何图形的事实标准 是二进制格式 内容包括层和几何图形的基本组成 CIF caltech intermediate format 叫caltech中介格式 是另一种基本文本的掩模描述语言 LEF library
  • python 图像识别男女_keras实现简单性别识别(二分类问题)

    importosimportrandomimportcv2importnumpy as npfrom tensorflow contrib keras api keras preprocessing image importImageDat
  • 什么是密码应用安全性评估?多久做一次密码应用安全性评估?

    随着信息技术的飞速发展 网络安全形势愈发严峻 各种安全威胁来势汹汹 勒索攻击 数据泄露等各种安全事件层出不穷 我国面临的网络安全问题同样严峻 而商用密码是保障网络空间安全的根本性核心技术和基础支撑 因此 更加标准和规范的管理和使用密码技术就
  • 146. LRU Cache

    1 The key to solve this problem is using a double linked list which enables us to quickly move nodes 2 The LRU cache is
  • 使用stelnet进行安全的远程管理

    1 telnet有哪些不足 2 ssh如何保证数据传输安全 需求 远程telnet管理设备 用户定义需要在AAA模式下 开启远程登录的服务 定义vty接口 然后从R2登录 是可以登录的 同理R3登录 在R1也可以查看哪些用户telnet登录
  • llvm是什么?

    llvm是什么 llvm是low level virtual machine的简称 其实是一个编译器框架 llvm随着这个项目的不断的发展 已经无法完全的代表这个项目了 只是这种叫法一直延续下来 llvm是一个开源的项目 它最早的时候是Il
  • 物联网IOT-基于STM32开发板的智能养殖系统+华为云平台+APP端应用+keil编译工具

    物联网IOT 基于STM32开发板的智能养殖系统 华为云平台 APP端应用 keil编译工具 文章摘要 整体展示 视频展示 1 流程图 1 硬件设备和APP端 华为云平台 一 项目场景及功能说明 1 项目场景 2 功能说明 二 华为云平台搭
  • CXF学习笔记---让通过参数传递数据

    整整折腾了3天终于通过CXF进行参数传递了 CXF的文档和sample都是存在问题的 这么一些简单的常用内容 硬是找不着 opensource的弊病 目地 通过webservice传递值以及错误信息 true 取result值 false
  • 基于Prometheus+Grafana搭建监控平台(Windows/Linux环境exporter部署)

    待优化 添加端口及防火墙开放配置 1 介绍 1 1 Prometheus是什么 Prometheus 普罗米修斯 是一个最初在SoundCloud上构建的监控系统 自2012年成为社区开源项目 拥有非常活跃的开发人员和用户社区 为强调开源及
  • GBDT回归数学推导

    GBDT回归数学推导 一 写在前面 前面推文讲了 GBDT 做回归的主流程 这篇推文讲数学推导啦 没有看过前面那一篇文章的童鞋建议先看一下 二 贴一下算法 来自李航 统计学习方法 算法8 4 输入 训练数据集 T x 1
  • 修复:Lua script attempted to access a non local key in a cluster node

    local key rate limit KEYS 1 local limit tonumber ARGV 1 local current tonumber redis call get key or 0 if current 1 gt l
  • Linux(RHEL6)启动过程详解

    Linux RHEL6 启动过程详解 Linux 红帽RHEL6 启动过程详解 RHEL的一个重要和强大的方面是它是开源的 并且系统的启动过程是用户可配置的 用户可以自由的配置启动过程的许多方面 包括可以指定启动时运行的程序 同样的 系统关
  • java Integer.compare Integer.compareTo() 比较大小

    今天看到这样的用法用于排序 Integer compare Arrays sort intervals x y gt Integer compare x 0 y 0 java lang包的Integer类的compare 方法比较作为参数给
  • pageHelper分页及工作原理浅析

    1 pageHelper PageHelper是Github上开源的MyBatis分页插件 使用起来简单 方便 支持多种数据库 Github网址 https github com pagehelper Mybatis PageHelper