关注spring boot微信公众号,第一时间了解最新的spring boot动态,当前已经更新到:《184. Spring Boot 2.0终于正式发布》 、《185.Spring Boot使用FastJson解析JSON数据:中文乱码》
需求缘起:
在之前的文章中我们介绍了mybatis的自定义插件以及原理,我们最终的目的是要分析下分页插件的原理。
一、PageHelper是如何在mybatis中工作
PageHelper是如何在mybatis中工作呢,是通过mybatis的pulgin实现了Interceptor接口。这个部分在之前的文章中花了不少篇幅进行介绍了,PageHelper也不另外,如下源码(版本:pagehelper-4.2.1):
@SuppressWarnings("rawtypes") @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})) public class PageHelper extends BasePageHelper implements Interceptor { private final SqlUtil sqlUtil = new SqlUtil(); @Override public Object intercept(Invocation invocation) throws Throwable { return sqlUtil.intercept(invocation); } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { sqlUtil.setProperties(properties); } }
这里就不过多在进行阐述。这里PageHelper有一个地方就是如何进行分页参数的传递的。
二、PageHelper使用原理
PageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句,所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句。看源码:
找到startPage代码:
public static <E> Page<E> startPage(int pageNum, int pageSize) { return startPage(pageNum, pageSize, true); }
最终是执行到代码:
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) { Page<E> page = new Page<E>(pageNum, pageSize, count); page.setReasonable(reasonable); page.setPageSizeZero(pageSizeZero); //当已经执行过orderBy的时候 Page<E> oldPage = SqlUtil.getLocalPage(); if (oldPage != null && oldPage.isOrderByOnly()) { page.setOrderBy(oldPage.getOrderBy()); } SqlUtil.setLocalPage(page); return page; }
这里有定义了一个Page对象,如下源码:
public class Page<E> extends ArrayList<E> { private static final long serialVersionUID = 1L; /** * 页码,从1开始 */ private int pageNum; /** * 页面大小 */ private int pageSize; /** * 起始行 */ private int startRow; /** * 末行 */ private int endRow; /** * 总数 */ private long total; /** * 总页数 */ private int pages; //摘取部分源码… }
这里重要的代码:SqlUtil.setLocalPage(page):
public static void setLocalPage(Page page) { LOCAL_PAGE.set(page); }
那么LOCAL_PAGE是什么呢?
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
所以PageHelper就是使用ThreadLocal存储了Page对象,在这个对象中有我们设置的pageNum、pageSize,也会查询返回的pages、total。
好了,就说这么多吧,更深入的东西还需要靠自己去摸索。
关注spring boot微信公众号,第一时间了解最新的spring boot动态,当前已经更新到:《185. Spring Boot 2.0终于正式发布》
———— 微信公众号 ————
提供Spring Boot资讯、技术文章,具体关注方式:
搜索springboot或者扫描以下二维码即可关注
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr
相关推荐
本教程将详细讲解如何在Spring Boot项目中集成MyBatis,并利用分页插件实现高效的数据分页。 首先,我们需要在Spring Boot项目中引入MyBatis依赖。在`pom.xml`文件中添加以下Maven依赖: ```xml <groupId>org....
在本篇中,我们将深入探讨如何在Spring Boot项目中集成MyBatis分页插件,以便为数据库查询提供高效、便捷的分页功能。Spring Boot以其简洁的配置和快速的开发体验深受开发者喜爱,而MyBatis作为轻量级持久层框架,与...
3. **分页插件**:PageHelper是常用的MyBatis分页插件,它能自动处理物理分页。在项目的pom.xml中引入PageHelper依赖,然后在MyBatis的配置文件中启用插件,并设置相关属性,如dialect(数据库类型)。 4. **Spring...
在Spring Boot项目的配置文件`application.yml`或`application.properties`中,添加MyBatis-Plus的配置。例如,在`application.yml`中: ```yaml mybatis-plus: global-config: db-config: id-type: AUTO ...
《Spring Boot整合MyBatis与MySQL的深度解析》 在当今的Java开发领域,Spring Boot以其简洁、快速的特性受到了广大开发者的喜爱。与此同时,MyBatis作为一款轻量级的持久层框架,以其灵活易用的特点在数据访问层面...
在本项目中,"Spring+mybatis+PageHelper分页插件"的组合是一个常见的Java后端开发架构,用于构建高效、便捷的数据分页功能。下面将详细解释这些技术及其结合方式。 首先,Spring是一个开源的Java应用框架,它提供...
MyBatis PageHelper插件是一款专为MyBatis设计的高效分页插件,它可以无缝对接Spring MVC、Spring Boot等框架,大大简化了分页操作。下面我们将详细探讨PageHelper的使用方法及其在实际项目中的应用。 首先,我们...
在`pom.xml`文件中添加MyBatis、MyBatis-Spring Boot Starter以及MyBatis的分页插件PageHelper的依赖: ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-web <groupId>org....
spring boot mybatis oracle 例子 1. 排序条件带上 2.分页语句下面连着查询语句 PageHelper.startPage(1, 2, "RECORD_DATE desc"); 实现分页,包已经导入了
Spring Boot与MyBatis集成分页插件 Spring Boot与MyBatis集成分页插件是一种常用的解决方案,它可以帮助开发者快速实现分页功能。下面我们将详细介绍如何集成Spring Boot与MyBatis的分页插件。 什么是MyBatis ...
MyBatis分页插件的出现,正是为了解决这一问题。 在MyBatis中实现分页查询,一般有两种方式:手动分页和使用插件。手动分页需要开发者自己编写SQL语句,计算offset和limit,这种方式繁琐且容易出错。而MyBatis分页...
在本项目"Spring boot +mybatis + layui简单demo"中,我们主要探讨了如何整合这三个技术来构建一个功能完备的Web应用。Spring Boot是Java领域的一款快速开发框架,旨在简化Spring应用的初始搭建以及开发过程;...
在Spring Boot中,我们可以使用Pageable接口结合MyBatis的动态SQL来实现分页查询。在Layui中,分页组件与后端接口配合,提供用户友好的翻页体验。 7. **数据库文件的使用** 提供的数据库文件是项目运行的基础,...
Mybatis分页插件,如PageHelper,是Mybatis的一个强大辅助工具,它能够自动处理数据库的分页查询,使得开发者无需手动编写复杂的分页SQL语句。该插件支持多种主流数据库,如MySQL、Oracle、SQL Server等。PageHelper...
总的来说,Spring Boot结合MyBatis的PageHelper插件为开发者提供了便捷的分页解决方案,极大地提高了开发效率。只需要简单的配置和调用,就能实现强大的分页功能,而且性能优秀,是Java Web开发中的得力助手。
-- Mybatis Spring Boot Starter --> <groupId>org.mybatis.spring.boot <artifactId>mybatis-spring-boot-starter <version>2.0.2 <!-- PageHelper 分页插件 --> <groupId>...
# Spring Boot 集成 MyBatis, 分页插件 PageHelper, 通用 Mapper ## 项目依赖 ```xml <!--mybatis--> <groupId>org.mybatis.spring.boot <artifactId>mybatis-spring-boot-starter <version>1.1.1 <!...
在本项目中,Spring Boot 将与 MyBatis 集成,MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 首先,我们需要确保开发环境...
Mybatis PageHelper是一款针对Mybatis框架的高效分页插件,它可以帮助开发者在进行数据库查询时轻松实现分页效果,从而提升用户体验并优化系统性能。PageHelper插件由开源中国社区的free团队开发,可以在其官方Git...
《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot以其简洁的配置和快速的启动特性,已经成为构建微服务应用的首选框架。而MyBatis作为一款强大的持久层框架,深受开发者喜爱,它提供了灵活的SQL映射...