深入源码分析Spring boot 集成Pagehelper

2023-11-10

引入依赖:

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

 pagehelper分页插件 github网址:https://github.com/pagehelper/Mybatis-PageHelper

 PageHelperAutoConfiguration

spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration

@Configuration
@ConditionalOnBean(SqlSessionFactory.class)
@EnableConfigurationProperties(PageHelperProperties.class)
@AutoConfigureAfter(MybatisAutoConfiguration.class)
@Lazy(false)
public class PageHelperAutoConfiguration 

可以在配置文件里自定义配置pagehelper,可以参考PageHelperProperties 定义参数

dialect
helperDialect
autoRuntimeDialect
autoDialect
reasonable
pageSizeZero
rowBoundsWithCount
offsetAsPageNum

 在PageHelperAutoConfiguration配置类里,在addPageInterceptor方法里会将你在配置文件里的配置导入拦截器

@PostConstruct
public void addPageInterceptor() {
    PageInterceptor interceptor = new PageInterceptor();
    Properties properties = new Properties();
    //先把一般方式配置的属性放进去
    properties.putAll(pageHelperProperties());
    //在把特殊配置放进去,由于close-conn 利用上面方式时,属性名就是 close-conn 而不是 closeConn,所以需要额外的一步
    properties.putAll(this.properties.getProperties());
    interceptor.setProperties(properties);
    for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) {
        org.apache.ibatis.session.Configuration configuration = sqlSessionFactory.getConfiguration();
        if (!containsInterceptor(configuration, interceptor)) {
            configuration.addInterceptor(interceptor);
        }
    }
}
/**
 * 接受分页插件额外的属性
 *
 * @return
 */
@Bean
@ConfigurationProperties(prefix = PageHelperProperties.PAGEHELPER_PREFIX)
public Properties pageHelperProperties() {
    return new Properties();
}

由此可以看出PageHelperAutoConfiguration主要就是将自定义配置的拦截器属性加入到Configuration拦截器链中。

下面分析下pagehelper-spring-boot-starter带有的pageHelper包,使用pagehelper-spring-boot-starter会自动将pageHelper拦截器加入mybatis的Configuration中

pagehelper-spring-boot-starter包含了pagehelper包
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
</dependency>

 在pagehelper包中,主要实现了mapper文件执行sql时判断是否查询统计总数以及对分页sql拼装查询当前页数记录,封装成Page实体返回结果。下面进入PageHelper包一探究竟;

PageHelper

目录结构

 cache包下主要是定义的抽象缓存工厂CacheFactory 以及Guava Cache 和 MyBatis Cache

dialect包下定义了一些方言 如Mysql数据库,oracle,sqlServer,Hsqldb等

page包下包括分页参数信息,分页接口方法

parser包下 就是Sql解析类 包含count order 

util包下就是一些工具类 主要有ExecutorUtil sql执行工具类,PageObjectUtil分页参数对象工具类

 见识下别人的工厂设计模式,可以借鉴使用

/**
 * 创建 SQL 缓存
 *
 * @param sqlCacheClass
 * @return
 */
public static <K, V> Cache<K, V> createCache(String sqlCacheClass, String prefix, Properties properties) {
    if (StringUtil.isEmpty(sqlCacheClass)) {
   //为空时,使用pageHelper cache包下定义的两个缓存
        try {
            Class.forName("com.google.common.cache.Cache");
            return new GuavaCache<K, V>(properties, prefix);
        } catch (Throwable t) {
            return new SimpleCache<K, V>(properties, prefix);
        }
    } else {
   //如果用户自定义了cache缓存,则走下面 给出 Cache接口交给开发者去自定义扩展实现
        try {
            Class<? extends Cache> clazz = (Class<? extends Cache>) Class.forName(sqlCacheClass);
            try {
    //通过有参构造函数来反射创建实体类
                Constructor<? extends Cache> constructor = clazz.getConstructor(Properties.class, String.class);
                return constructor.newInstance(properties, prefix);
            } catch (Exception e) {
                return clazz.newInstance();
            }
        } catch (Throwable t) {
            throw new PageException("Created Sql Cache [" + sqlCacheClass + "] Error", t);
        }
    }
}

pageHelper对sql分页查询可以参考:pageHelper拦截器

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

深入源码分析Spring boot 集成Pagehelper 的相关文章

随机推荐

  • opencv--图像金字塔--高斯金字塔

    什么是图像金字塔 我们需要了解一个概念 尺度 尺度 顾名思义就是说图像的尺寸和分辨率 在我们进行图像处理的时候 会经常对源图像的尺寸进行放大或者缩小的变换 进而转换为我们指定尺寸的目标图像 在对图像进行放大和缩小的变换的这个过程 我们称为尺
  • QT多线程(QThread)小结

    QThread只有run函数是在新线程里的 其他所有函数都在QThread生成的线程里 如果QThread是在ui所在的线程里生成 那么QThread的其他非run函数都是和ui线程一样的 所以 QThread的继承类的其他函数尽量别要有太
  • 如何使用 Xshell 连接 Linux 服务器

    目录 搭建 Linux 环境 Linux 环境的搭建方式 购买云服务器 使用Xshell远程登陆到Linux服务器 下载安装Xshell 查看Linux主机ip 使用Xshell登录主机 方法1 方法2 额外补充 总结 搭建 Linux 环
  • GBase 8s V8.8 SQL 指南:教程-1.4

    1 4 示例代码约定 SQL 代码的示例在整个出版物中出现 除非另有说明 代码不特定于任何单个的 GBase 8s 应用程序开发工具 如果示例中仅列出 SQL 语句 那么它们将不用分号定界 例如 您可能看到以下示例中 的代码 要将此 SQL
  • 【100%通过率】【华为OD机试c++/java/python】通信误码【 2023 Q1考试题 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 信号传播过程中会出现一些误码 不同的数字表示不同的误码ID 取值范围为1 65535 用一个数组记录误码出现的情况 每个误码出现的次数代表误码频
  • 04目标检测-Two-stage的目标检测算法

    目录 一 深度学习目标检测算法介绍 二 基于Two stage的目标检测算法 三 Two stage基本流程 四 Two stage常见算法 五 Two stage核心组件 1 Two stage的两个核心组件 2 主干CNN网络设计原则
  • 大一软件工程学生想买电脑,应该如何选择呢?

    全文1万多字 计算机专业怎么选购笔记本电脑 哪些电脑性价比高 轻薄本 全能本 游戏本有什么推荐 看这篇就够了 每天都有邀请我回答关于计算机专业电脑选择的问题 看来如何选购电脑确实是大学生的痛点 不过丑话先说在前面 本人是CS科班毕业 但由于
  • git更新pull不下来代码_git pull更新错误解决办法

    Your local changes to the following files would be overwritten by merge error Your local changes to the following files
  • conda的一些简单操作 for Mac

    在终端输入 conda h 就会列出conda的介绍 和一些命令 如 clean config create help info install list package remove uninstall search update upg
  • 程序员入门教程【非常详细】从零基础入门到精通,看完这一篇就够了 !

    零基础编程入门先学什么 编程语言有几百种 我们应该怎么选择 想学习编程 加入互联网行业 哪一个更有前途 在小白学习编程会有各种各样的问题 今天小编我就来为你解答 一 怎么选择编程语言 编程语言有很多种 但方向不同 每个人都需要根据工作方向
  • BUUCTF闯关日记--[CISCN2019 华北赛区 Day2 Web1]Hack World

    可恶 明明当初想着是写给自己看的 文章越写越多 越来越在意别人会不会看我的文章了 还是太功名利禄了 我得清高点 这是写给自己看 这是写给自己看 这是写给自己看 进入页面 可以看到只有一个白框 多半是SQL注入 直接开始做题 输入 1 回显
  • win10任务管理器快捷键是什么

    win10任务管理器快捷键是什么 Ctrl Shift ESC
  • Zabbix整合钉钉实战

    1 基本告警思路 钉钉类似于微信 但是偏向于办公方向 可以通过钉钉的群机器人功能 实现将告警信息通过机器人发送到钉钉群 群机器人是钉钉群的高级扩展功能 群机器人可以将第三方服务的信息聚合到群聊中 实现自动化的信息同步 2 添加钉钉机器人 首
  • YOLOV5学习笔记(一)——原理概述

    目录 一 目标检测概述 1 1 数据集介绍 1 2 性能指标 1 2 1 混淆矩阵 1 2 2 IOU 边界框回归 1 2 3 AP mAP 1 2 4 检测速度 1 3 YOLO发展史 1 3 1 算法思想 1 3 2 YOLOv5网络架
  • NLP学习(九)文本向量化doc2vec及案例实现-Python3实现

    doc2vec基本原理 A distributed memory model 训练句向量的方法和词向量的方法非常类似 训练词向量的核心思想就是说可以根据每个单词的上下文预测 也就是说上下文的单词对是有影响的 那么同理 可以用同样的方法训练d
  • opengl库中gl glu glut glaux的区别

    GL GLU GLUT的关系 OpenGL中的gl库是核心库 glu是实用库 glut是实用工具库 gl是核心 glu是对gl的部分封装 glut是OpenGL的跨平台工具库 gl中包含了最基本的3D函数 而glu似乎对gl的辅助 如果算数
  • AIGC零基础30天学习——CLIP与zero-shot

    在前面对CLIP的学习中 对zero shot prediction环节一直有一些疑惑 zero shot是什么 它该如何进行操作 1 zero shot是什么 zero shot是指零样本学习 和zero shot相关联的概念包括many
  • 用java写一个简单的考勤管理系统

    我可以为您提供一个参考 您可以使用Java语言来编写一个简单的考勤管理系统 具体的步骤如下 1 定义考勤类 它包括考勤日期 考勤时间以及考勤状态 2 定义考勤管理类 实现考勤的添加 删除 查看等操作 3 定义用户类 它包括用户的姓名 职位
  • GO语言网络编程(并发编程)并发介绍,Goroutine

    GO语言网络编程 并发编程 并发介绍 Goroutine 1 并发介绍 进程和线程 A 进程是程序在操作系统中的一次执行过程 系统进行资源分配和调度的一个独立单位 B 线程是进程的一个执行实体 是CPU调度和分派的基本单位 它是比进程更小的
  • 深入源码分析Spring boot 集成Pagehelper

    引入依赖